【PHP】フォームを作る

テキストの送信フォーム
 
例(送信フォーム画面)
<form action="xxx.php" method="post">
  //action属性:送信ボタンを押したあとに移動するページのURLを記入
  //method:フォームの入力内容のデータの送信形式を指定(getかpostだが、フォームではpostが一般的)
get:URL入力された値をのせて送信する
post:URLにはのせず、裏側で処理をする
 
<input type="text" id="my_name" name="my_name" maxlength="255" value="">
  //type属性:表示されるテキストフィールドの種類を指定
//id属性:個々の入力項目を管理するid/class名のようなもの
  //name属性:個々の入力項目を管理するid/class名のようなもの(通常idと同じにする)
  //maxlength属性:最大値を指定
  //value属性:初期値を設定することができる
 
<input type="submit" value="送信する"></input>
  //tipe属性:submitとすれば送信ボタンになる
  //value属性:ボタンに表示する文字を自由に指定できる
 
例(入力されたデータを受け取る画面)
xxx.php
 
お名前:<?php print(htmlspecialchars($_REQUEST['my_name'],ENT_QUOTES)); ?>
   //$_REQUEST['my_name']:inputタグで入力されたname属性の値を受け取る。
   //htmlspecialchars(何を、どのように):2つのパラメーターを指定。2つ目はENT_QUOTES(''をつけない)とする。
※htmlspecialchars(何を、どのように):セキュリティのため、HTMLのタグを入力された場合もただの文字列として受け取る。
※$_REQUESTにすると、getでもpostでも受け取ることができる。
※$_REQUESTを使うと、postで送らなければいけないパスワードなどもgetで送られる可能性がある。よって通常は、inputタグで指定したmethod属性に対応させ、$_GETもしくは$_POSTとする。
 
 
 
 
例(送信フォーム画面)
<input type="radio" name="gender" value="male">男性/
<input type="radio" name="gender" value="female">女性  //ボタンに表示されている男性・女性ではなく、value属性の値が出力される。
 
例(入力されたデータを受け取る画面)
<?php print(htmlspecialchars($_POST['gender'],ENT_QUOTES)); ?>
 →male/femaleが出力。
 
 
 
 
例(送信フォーム画面)
<input type="checkbox" name="agree" value="on">同意する
 
 
複数の場合
例(送信フォーム画面)
<input type="checkbox" name="reserve" value="1/1">1月1日
<input type="checkbox" name="reserve" value="1/2">1月2日
<input type="checkbox" name="reserve" value="1/3">1月3日
//複数のチェックボックスの値を送信するには、name属性に[]をつける必要がある
 
例(入力されたデータを受け取る画面)
foreach ($_POST['reserve'] as $reserve){
print (htmlspecialchars($reserve, ENT_QUOTES) .' ');
}   //複数のチェックボックスのデータを受けとる際は、配列で受け取る
 
 
 
セレクトタグ
 
例(送信フォーム画面)
<select name="pref">
<option value="apple">りんご</option>
<option value="peach">もも</option>
</select>
 
 
 
※フォームでは、画面に表示している情報ではなく、value属性の値が送られることに注意。

【PHP】JSONを読み込む

JSONとは
Javascript Object Notation の略。
ファイル形式のひとつ。
 
 
メリット
・短く書ける
・各データの内容がわかりやすい
 
 
使用例
<?php
 
$file = file_get_contents('https://xxxxx');
//ファイルのパスを渡し、返り値としてjsonの内容をテキストファイル形式で受け取る
 
$json = json_decode($file);
//JSONを処理した結果(PHPのオブジェクトの形式)を返り値として受け取る
 
foreach($json->items as $item):
//jsonファイルの中のitemsという配列にアクセスし、$itemで受け取る
 
?>
 
<a href="<?php print($item->url); ?>"><?php print($item->title); ?></a>
 
<?php
endforeach;
?>
 

【Laravel】Viewのディレクティブ機能 @extends、@section、@yield

ビューの継承
ビューの作成には、親の持っている機能を子が使う「継承」が使われる。
以下、公式ドキュメントより一部抜粋。
 
Bladeを使用する主な利点は、テンプレートの継承とセクションです。
 
ご覧の通り、典型的なHTMLマークアップで構成されたファイルです。しかし、@sectionや@yieldディレクティブに注目です。@sectionディレクティブは名前が示す通りにコンテンツのセクションを定義し、一方の@yieldディレクティブは指定したセッションの内容を表示するために使用します。
 
子のビューを定義するには、「継承」するレイアウトを指定する、Blade @extendsディレクティブを使用します。Bladeレイアウトを拡張するビューは、@sectionディレクティブを使用し、レイアウトのセクションに内容を挿入します。前例にあるようにレイアウトでセクションを表示するには@yieldを使用します。
 
 
流れのイメージ
  • 各ページの共通レイアウトを親ビューとして、異なる部分だけを子ビューとして作成したい。
  • 子ビューで親ビューを継承するよと宣言すれば、親ビューの持っているレイアウトが反映される。
  • 子ビューには、親ビューの中で使いたい自分固有のパーツを書く。
  • 親ビューでは、各子ビュー固有のパーツをどこで反映させるのかを書いておく。
  • これで各ページにアクセスがあれば、親ビューをベースとした各子ビュー固有の画面が表示される。
 
 

*親ビューですること

  • @yieldで各子ビュー固有のパーツをどこで反映させるのかを記述する。

*子ビューですること

  • @extendsで今から親ビューを継承するよと宣言する。
  • @sectionで自分固有のパーツを定義する。
 
 
試してみる
例として、welcome.blade.phpというデフォルトでトップページに設定されているファイルを、親ビューと子ビューに分けてみる。
 
実際に表示されるのは子ビューなので、これをwelcome.blade.phpとする。
親ビューはresources/views/commonディレクトリの中に、layout.blade.phpを作成する。
 
まずはwelcome.blade.phpの内容を全てlayout.blade.phpにコピーし、親ビューの土台を作る。
 
そしてwelcome.blade.phpの記述を、下記の内容のみにする。
welcome.blade.php
 
@extends('common.layout')  //commonディレクトリのlayout.blade.phpを親ビューとして継承する。
 
@section('child') //welcome.blade.php固有のパーツをchildという名前で定義する。
<p>表示する内容<p>
@endsection //セクションの定義を終了する。
 
次にlayout.blade.phpでは、子ビューで定義した @section<p>表示したい内容<p> を表示したい位置に、以下の通り記述する。@yield('child')を記述した場所に@section('child')の内容がそのまま反映される。
layout.blade.php
 
@yield('child')
 
以上の記述により、welcome.blade.php(子ビュー)にアクセスされた時、layout.blade.php(親ビュー)をベースとしたレイアウトにwelcome.blade.php固有のパーツが組み込まれて表示される。

【Laravel】Modelの作成

Modelを作る
プロジェクトのディレクトリに移動し、下記コマンドを実行する。
ターミナル
$ php artisan make:model Book
「Book」の部分は、対応するテーブルの単数形を記述する。
ここではモデル名をBookとすることで、自動的にBooksテーブルと紐付けてくれる。
 
Model created successfully.
と出ればOK。
 
bookapp(プロジェクト名)/app/Modelsの中に、Book.phpというファイルが生成されている。

【Laravel】データベーステーブルとmigration

テーブル作成の流れ
・テーブルの下地となるマイグレーションファイルを生成する。
マイグレーションファイルにカラムの構造を書き込む。
・データベース側にマイグレーションファイルの内容を反映させる。
 
マイグレーションファイルは、プロジェクトを生成するとデフォルトで存在している。
database/migrationsディレクトリに、
 2014_10_12_000000_create_users_table.php
といった名前、ユーザー認証やセキュリティのためのマイグレーションファイルがいくつか用意されている。
 
migrationファイルを生成すると、このdatabase/migrationsディレクトリに追加されていく事になる。
 
 
migrationファイルを生成する
プロジェクトのディレクトリに移動し、以下のコマンドでマイグレーションファイルを作成する。
ターミナル
$ cd phpstudy
$ cd bookapp
$ php artisan make:migration create_books_table --create=books
 
結果
Created Migration: 2021_03_05_030455_create_books_table
 
実行後、database/migrationsディレクトリにマイグレーションファイルが作成されている。
ファイル名は、タイムスタンプとコマンド時に入力したcreate_users_tableで構成されている。
<?php
 
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreateBooksTable extends Migration
{
 
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
 
public function down()
{
Schema::dropIfExists('users');
}
}
主な内容
  • use文で使用したいクラスを宣言する。
  • CreateBooksTableクラスはMigrationクラスを継承している。
  • CreateBooksTableクラスにはup関数とdown関数がある。
  • up関数の中でカラムを定義する。
  • down関数の中ではテーブル削除の処理が記述されている。
 
 
カラムの構成を編集する
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->timestamps();
});
ここでは、整数のid・文字列のtitleを定義した。
 
 
データベースの設定をする
プロジェクトディレクトリ/config/database.phpを編集する。
'default' => env('DB_CONNECTION', 'sqlite'),
今回はsqliteを使うので、sqliteと書き換える。
 
.envファイルも以下のように書き換える。
DB_CONNECTION = sqlite
DB_DATABASE=/Users/hinako/phpstudy/bookapp/database/database.sqlite
 
 
database.sqliteを作成する
database.sqliteを参照するよう定義したが、このファイルがまだ実在しないので、作成する。
ターミナル
$ cd database
$ touch database.sqlite
ターミナルでファイルを作りたいディレクトリに移動し、touchコマンドで空ファイルを作成する。
 
 
migrationを実行してデータベースに反映させる
ターミナル
$ cd ~/phpstudy/bookapp
$ php artisan migrate
プロジェクトファイルに移動し、migrateを実行する。
 
Migration table created successfully.
の後に作成されたテーブルの内容が表示されれば完了。

【SQL】データのグループ化(GROUP BY・HAVING)

  • GROUP BY
GROUP  BY カラム名:指定したカラムで、完全に同一のデータを持つレコード同士がグループになる
GROUP  BY カラム名,カラム名カラム名を複数指定してグループ化することもできる
※SELECTで使えるのは、GROUP BYで指定しているカラム名と集計関数のみ
SELECT
COUNT(price),purchased_at
FROM purchases
GROUP BY purchased_at; //日付ごとのpriceの回数を取得
 
 
  • WHEREとGROUP BYの併用
記述の順番
SELECT 集計関数
FROM テーブル名
WHERE 条件
 
実行される順番
検索:WHERE
グループ化:GROUP BY
関数:COUNT・SUM・AVG・MAX・MIN
 
SELECT SUM(price),purchased_at,name
FROM purchases
WHERE category="お菓子"
GROUP BY purchased_at,name;   
   //categoryがお菓子のレコードを集計。日付と名前でグループ化。金額合計、日付、名前のデータを取得。
 
 
  • HAVING
GROUP BY カラム名
HAVING 条件   :グループ化したデータから、さらに条件に合うグループを取得する
 
実行される順番
検索:WHERE  //テーブル全体が検索対象
グループ化:GROUP BY
関数:COUNT・SUM・AVG・MAX・MIN
HAVING:HAVING  //グループ化されたデータが検索対象
※実行される順番の規則上、グループ化したあとの条件を絞り込むにはWHEREではなくHAVINGを使う
 
SELECT SUM(price),purchased_at,name
FROM purchases
GROUP BY purchased_at,name
HAVING SUM(price)>1000;
//合計金額・日付・名前のデータを取得。日付と名前でグループ化。priceカラムのデータの合計が1000を超えるグループを検索。
 
 
 
 

【SQL】データの編集・集計関数

  • DISTINCT
DISTINCT(カラム名):検索結果から指定したカラムの重複するデータを除く
SELECT DISTINCT(name)
FROM purchases;
 
  • 四則演算
カラム名 演算子:四則演算を実行した結果を表示する
SELECT name, price, price*1.1   //nameカラム、priceカラム、priceカラム*1.1の数値を取得
FROM purchases;
 
  • SUM関数
SELECT SUM(カラム名):指定したカラムの合計を計算する
SELECT SUM(price)
FROM purchases
WHERE name = "プリン";
 
AVGカラム名):指定したカラムの平均を計算する
SELECT AVG(price)
FROM purchases
WHERE name ="プリン";
 
  • COUNT関数
COUNT(カラム名):指定したカラムのデータの合計数を計算する(NUllは除く)
COUNT(*):全てのカラムを指定し、レコーソ数を計算する(Nullも含む)
SELECT COUNT(*)
FROM purchases
WHERE name="プリン";
 
  • MAX/MIN関数
MAX(カラム名)・MIN(カラム名):指定したカラムのデータの中から、最大のデータ・最小のデータを取得する
SELECT MAX(price)
FROM purchases
WHERE name="プリン";