Parallels Desktop ブラックフライデーセール 25%OFFGo!

【PHP入門】フォームからのデータ受け取りとバリデーション

PHPでフォームからデータを受け取る方法

Webアプリケーション開発において、フォームからのデータ受け取りバリデーションは非常に重要な要素です。この記事では、PHPを使ったフォームからのデータ受け取りとバリデーションについて解説します。

目次

GETとPOSTの違い

GETPOSTは、HTTPプロトコルを使用してWebサーバーとWebクライアントの間でデータを送受信するためのメソッド(方式)です。フォームからPHPスクリプトにデータを送るときは、GETまたはPOSTメソッドを使います。

以下、難しい説明をしますが、結論を言うとお問い合わせやアンケートのフォームを作る場合はPOSTメソッドを使います。だいたい何でもPOSTメソッドを使います。

GET

GETは、ブラウザからWebサーバーに情報を要求するために使用されるメソッドです。このメソッドは、URLの末尾にパラメータを付与することで、データを送信します。URLには、?以降にパラメータが記述され、複数のパラメータがある場合は&で区切られます。例えば、以下のようなURLがGETメソッドで送信されます。

https://example.com/index.php?name=hanako&age=112

この場合、nameageという2つのパラメータが含まれています。Webサーバーは、このパラメータを解析して、クライアントに応答します。

POST

POSTは、WebブラウザからWebサーバーにデータを送信するために使用されるメソッドです。このメソッドは、HTTPボディ(私たちからは見えないところ)にデータを含めて送信します。POSTメソッドでは、送信されたデータはURLに含まれないため、GETメソッドよりもセキュリティが高いとされています。

GETとPOSTの違いと使い分け

GETPOST
URLにパラメータを含めてデータを送信する
データはブラウザの履歴やブックマークに保存される
ブラウザにキャッシュすることができる
データの長さに制限がある
データの取得に適している
HTTPボディにデータを含めて送信する
データはブラウザの履歴やブックマークに保存されない
ブラウザにキャッシュすることができない
データの長さに制限はない
データの送信に適している

というわけで、GETはページを表示するために使うパラメータを取得するときに使います。送信するときに使うんじゃないんかいと思うかもしれませんが、送信するときに使うとURLにパラメータが含まれるので、その情報を取得することができるという意味です。で、そのURLをブックマークしたり、リンクを張ったりして再利用できるというわけです。Googleの検索フォームなどはGETメソッドですね。

そして、POSTはフォームに入力されたデータをサーバに送信するときに使います。GETのように、送信した情報を再利用することはできません。再利用されては困るときに使います。お問合せやログインフォームなどはこちらを使います。

HTMLでフォームを作成するときに、<form>タグのmethod属性にgetpostのどちらを指定すればいいか悩む方が多いので説明しました。以上の説明のとおり、フォームからデータを送信する場合はだいたいpostを使用します(だいたいって何)。

PR

無料で利用できるプログラミング学習サービスをお探しならば 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
        )

)

なお、GETメソッドで送信された場合は、$_GETにデータが格納されます。POST, GETどちらのメソッドでも受け取れる変数$_REQUESTもあります。

データのバリデーションをする方法

フォームデータを受け取った後、それらのデータが期待される形式かどうかを確認することは非常に重要です。これをバリデーションと呼びます。バリデーションを行うことで、アプリケーションのセキュリティや正確性を高めることができます。

必須項目のチェック

必須項目に値が入っているか確認するにはempty()関数を使います。

if (empty($_POST['name'])) {
  echo '名前を入力してください';
}
if (empty($_POST['email'])) {
  echo 'メールドレスを入力してください';
}

empty()関数は、引数がnull0falseのときに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が返ります。

似たような関数でis_int()がありますが、これは引数が整数型かどうかを確認する関数です。フォームから送信されるデータは数値であっても文字列型で送信されるので、is_int()は使えません。is_numeric()を使う必要があります。

//有効な形式かどうかの確認
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個書けます。それくらいバリデーション・マスターへの道のりは険しいということです。

ライブラリを使う方法

いろいろ申し上げてきましたが、バリデーションをするにはサードパーティ製のライブラリを利用するという手もあります。というか、だいたいみんなそうしてます。

おすすめのライブラリはこちらです。

でわでわ

PR

無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。

PHPでフォームからデータを受け取る方法

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次