Webアプリケーション開発において、フォームからのデータ受け取りとバリデーションは非常に重要な要素です。この記事では、PHPを使ったフォームからのデータ受け取りとバリデーションについて解説します。
GETとPOSTの違い
GETとPOSTは、HTTPプロトコルを使用してWebサーバーとWebクライアントの間でデータを送受信するためのメソッド(方式)です。フォームからPHPスクリプトにデータを送るときは、GETまたはPOSTメソッドを使います。
以下、難しい説明をしますが、結論を言うとお問い合わせやアンケートのフォームを作る場合はPOSTメソッドを使います。だいたい何でもPOSTメソッドを使います。
GET
GETは、ブラウザからWebサーバーに情報を要求するために使用されるメソッドです。このメソッドは、URLの末尾にパラメータを付与することで、データを送信します。URLには、?
以降にパラメータが記述され、複数のパラメータがある場合は&
で区切られます。例えば、以下のようなURLがGETメソッドで送信されます。
https://example.com/index.php?name=hanako&age=112
この場合、name
とage
という2つのパラメータが含まれています。Webサーバーは、このパラメータを解析して、クライアントに応答します。
POST
POSTは、WebブラウザからWebサーバーにデータを送信するために使用されるメソッドです。このメソッドは、HTTPボディ(私たちからは見えないところ)にデータを含めて送信します。POSTメソッドでは、送信されたデータはURLに含まれないため、GETメソッドよりもセキュリティが高いとされています。
GETとPOSTの違いと使い分け
GET | POST |
---|---|
URLにパラメータを含めてデータを送信する データはブラウザの履歴やブックマークに保存される ブラウザにキャッシュすることができる データの長さに制限がある データの取得に適している | HTTPボディにデータを含めて送信する データはブラウザの履歴やブックマークに保存されない ブラウザにキャッシュすることができない データの長さに制限はない データの送信に適している |
というわけで、GETはページを表示するために使うパラメータを取得するときに使います。送信するときに使うんじゃないんかいと思うかもしれませんが、送信するときに使うとURLにパラメータが含まれるので、その情報を取得することができるという意味です。で、そのURLをブックマークしたり、リンクを張ったりして再利用できるというわけです。Googleの検索フォームなどはGETメソッドですね。
そして、POSTはフォームに入力されたデータをサーバに送信するときに使います。GETのように、送信した情報を再利用することはできません。再利用されては困るときに使います。お問合せやログインフォームなどはこちらを使います。
HTMLでフォームを作成するときに、<form>
タグのmethod
属性にget
とpost
のどちらを指定すればいいか悩む方が多いので説明しました。以上の説明のとおり、フォームからデータを送信する場合はだいたいpost
を使用します(だいたいって何)。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
HTMLフォームの作成方法
HTMLフォームを作成するには、<form>
タグを使用します。<form>
タグには、action
属性とmethod
属性を指定する必要があります。
action
属性は、データの送信先URLを指定し、method
属性は、データを送信するHTTPメソッドを指定します。上記で説明したとおり、だいたいPOSTメソッドが使用されます(だいたいって何)。
<form action="送信先URL" method="HTTPメソッド">
<!-- フォームの中身 -->
</form>
<form>
要素の中身には、input
要素やtextarea
要素など、フォームに含める入力要素を配置します。具体的に、簡単なお問い合わせフォームを作ってみます。
<form action="form.php" method="post">
<label>名前:</label>
<input type="text" name="name">
<label>メールアドレス:</label>
<input type="email" name="email">
<label>本文:</label>
<textarea name="message"></textarea>
<input type="submit" value="送信">
</form>
上記の例では、次の要素を配置しました。
- 名前を入力するテキストボックス
- メールアドレスを入力するテキストボックス
- 本文を入力するテキストエリア
- 送信ボタン
それぞれの要素のname
属性で要素に名前を付けます。すると、「要素の名前=値」という形式でデータが送信されます。
複数の選択肢があるフォーム部品の書きかた
HTMLフォームには、チェックボックスやマルチセレクトボックスのように複数の値を選択できる部品があります。この場合は次のように書きます。
<!-- チェックボックスの場合 -->
<form action="form.php" method="post">
<div>好きなおにぎりの具は?(複数選択可):</div>
<input type="checkbox" name="onigiri[]" value="ume"> <label>うめぼし</label>
<input type="checkbox" name="onigiri[]" value="sake"> <label>さけ</label>
<input type="checkbox" name="onigiri[]" value="kombu"> <label>こんぶ</label>
<input type="checkbox" name="onigiri[]" value="tunamayo"> <label>ツナマヨ</label>
<input type="checkbox" name="onigiri[]" value="kuniku"> <label>狗肉</label>
<input type="submit" value="送信">
</form>
<!-- マルチセレクトボックスの場合 -->
<form action="form.php" method="post">
<div>好きなおにぎりの具は?(複数選択可):</div>
<select name="onigiri[]" size="5" multiple>
<option value="ume">うめぼし</option>
<option value="sake">さけ</option>
<option value="kombu">こんぶ</option>
<option value="tunamayo">ツナマヨ</option>
<option value="kuniku">狗肉</option>
</select>
<input type="submit" value="送信">
</form>
要素のname
属性をonigiri[]
のようにします。この角括弧[]
をつけることで、複数の値を受け取り送信することができます。value
属性が値になるので忘れずに指定してください。
これで、「要素の名前=[値1,値2 …]」という配列の形式でデータが送信されます。
データを受け取る方法
HTMLフォームから送信されたデータをPHPで受け取る方法について解説します。
POSTメソッドでフォームが送信された場合、受け取ったデータは、スーパーグローバル変数の$_POST
に格納されます。$_POST
は、連想配列として定義されており、各フォーム要素のname
属性がキー、value
属性が値として格納されます。
例えば、以下のようなフォームからデータを送信してみます。
<form action="form.php" method="post">
<label>名前:</label>
<input type="text" name="name">
<label>メールアドレス:</label>
<input type="email" name="email">
<div>好きなおにぎりの具は?(複数選択可):</div>
<input type="checkbox" name="onigiri[]" value="ume"> <label>うめぼし</label>
<input type="checkbox" name="onigiri[]" value="sake"> <label>さけ</label>
<input type="checkbox" name="onigiri[]" value="kombu"> <label>こんぶ</label>
<input type="checkbox" name="onigiri[]" value="tunamayo"> <label>ツナマヨ</label>
<input type="checkbox" name="onigiri[]" value="kuniku"> <label>狗肉</label>
<input type="submit" value="送信">
</form>
送信されたデータを受け取るPHPスクリプト(form.php)は、次のようになります。
$name = $_POST['name'];
$email = $_POST['email'];
$onigiri = implode(', ', $_POST['onigiri']);
echo '名前: ' . $name;
echo 'メールアドレス: ' . $email;
echo '好きなおにぎりの具: ' . $onigiri;
print_r($_POST);
名前: まさを メールアドレス: masawo@example.com 好きなおにぎりの具: kombu, tunamayo, kuniku Array ( [name] => まさを [email] => masawo@example.com [onigiri] => Array ( [0] => kombu [1] => tunamayo [2] => kuniku ) )
データのバリデーションをする方法
フォームデータを受け取った後、それらのデータが期待される形式かどうかを確認することは非常に重要です。これをバリデーションと呼びます。バリデーションを行うことで、アプリケーションのセキュリティや正確性を高めることができます。
必須項目のチェック
必須項目に値が入っているか確認するにはempty()
関数を使います。
if (empty($_POST['name'])) {
echo '名前を入力してください';
}
if (empty($_POST['email'])) {
echo 'メールドレスを入力してください';
}
empty()
関数は、引数がnull
、0
、false
のときにtrue
を返します。したがって、上記の例では値が入力されていなければエラーメッセージを出力します。
気を付けなければならないのは、empty()
関数を使うと、値として0
が入力された場合にも何も入力されていないとみなされてしまうことです。値として0
を許容したいならば他の方法を使わなければなりません。
if (!isset($_POST['age'])) {
echo '年齢を入力してください';
}
isset()
関数は、変数が存在していて、値がnull
以外ならばtrue
を返します。そして、否定の論理演算子!
を付けることによって、戻り値を反転させています。つまり、値がnull
(未入力)ならばtrue
を返します。
文字列の長さのチェック
文字列の長さを制限したいときはmb_strlen()
関数を使います。
if (mb_strlen($_POST['name']) > 32) {
echo '名前は32文字以内で入力してください';
}
mb_strlen()
関数は文字列の長さ(文字数)を取得します。それを制限値と比較することで、文字列の長さをチェックすることができます。
データ型のチェック
入力された値が期待されるデータ型かを確認します。
//数値かどうかの確認
if (!is_numeric($_POST['name'])) {
echo '年齢は数値で入力してください';
}
is_numeric()
関数は引数が数値または数値形式の文字列ならばtrue
を返します。上記の例は、否定の論理演算子!
が付いているので、値が数値でなければtrue
が返ります。
//有効な形式かどうかの確認
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '有効なメールアドレスを入力してください';
}
filter_var()
関数は、指定したフィルタでデータをフィルタリングします。フィルタリングに成功すれば、フィルタリングされたデータを返します。失敗すればfalse
を返します。
上記の例では、FILTER_VALIDATE_EMAIL
というフィルタを使って、メールアドレスが有効な形式かをチェックしています。
メールアドレスの形式をチェックするフィルタの他、数値、整数、ドメイン、IPアドレス、URLなどの形式をチェックするためのフィルタが用意されています。利用できるフィルタは下記のページで確認してください。
パターンのチェック
入力された値が特定のパターンに一致するかどうかをチェックすることもできます。これができるようになると、バリデーション・マスターの称号が与えられるそうです(誰から?)。
//郵便番号の形式(000-0000)の確認
if (!preg_match('/^\d{3}-\d{4}$/', $_POST['postalcode'])) {
echo '有効な郵便番号を入力してください';
}
preg_match()
関数は、正規表現によるマッチングを行います。値$_POST['postalcode']
が正規表現のパターン'/^\d{3}-\d{4}$/'
に一致すれば1
、しなければ0
を返します。
正規表現とはなんぞや?というあなたは、以上の説明では全然納得できないでしょうが、ここでは正規表現の説明はしません。できません。それだけで記事が10個書けます。それくらいバリデーション・マスターへの道のりは険しいということです。
ライブラリを使う方法
いろいろ申し上げてきましたが、バリデーションをするにはサードパーティ製のライブラリを利用するという手もあります。というか、だいたいみんなそうしてます。
おすすめのライブラリはこちらです。
でわでわ
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
コメント