本文へスキップ
BecomeCoder

PHPコース · 第7章 Webアプリの実務 · レッスン23

フォーム処理とバリデーション ― 入力を検証する

ブラウザで完結

導入

第1章の終わり(レッスン19)で、$_POST からフォームの値を受け取る仕組みを見ました。しかし実際のアプリでは、送られてきた値をそのまま信じてはいけません。「名前が空のまま送信された」「メールアドレスの形式がおかしい」――こうした**入力チェック(バリデーション)**を必ず行います。

説明

本来 $_POST はブラウザからのHTTPリクエストで自動的に埋まりますが、このレッスンでは学習のためコードの中で直接代入して、フォームが送られてきた状態を再現します。

<?php
// 本来はHTTPのPOSTで届く値。ここでは学習のため直接代入して再現します。
$_POST['name'] = "  田中太郎  ";
$_POST['email'] = "tanaka@example.com";

$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');

$errors = [];
if ($name === '') {
    $errors[] = "名前を入力してください";
}
if (!str_contains($email, '@')) {
    $errors[] = "メールアドレスの形式が正しくありません";
}

if (empty($errors)) {
    echo "受け付けました: " . htmlspecialchars($name) . "\n";
} else {
    foreach ($errors as $e) {
        echo "エラー: {$e}\n";
    }
}

?? ''null合体演算子)で「値が無ければ空文字」にしてから trim() で前後の空白を取り除くのが定番の受け取り方です。str_contains($haystack, $needle) は PHP 8 で入った関数で、「$haystack$needle が含まれているか」を真偽値で返します(メールの簡易チェックに使いました。厳密なチェックは正規表現で行います。第8章で学びます)。

エラーが無ければ処理を進め、あれば $errors にためたメッセージを表示する、という「先にすべて検証してからまとめてエラーを出す」形は実務でもよく使われます。表示するときは htmlspecialchars() を通すのを忘れないようにしましょう(第19レッスンで学んだ、悪意ある文字を無害化する関数です)。

やってみよう

$_POST['name'] を空文字 "" にしたり、$_POST['email']"@" を含まない文字列にしたりして、エラーメッセージがどう表示されるか確かめましょう。両方エラーにすると2行表示されます。

演習

$_POST['age']"17" を代入してください。それを整数に変換し、18 以上なら "登録できます"18 未満なら "18歳未満は登録できません" と表示してください。

ヒント1を見る

$age = (int)($_POST['age'] ?? 0); で整数に変換します。

ヒント2を見る

if ($age >= 18) { echo "登録できます\n"; } else { echo "18歳未満は登録できません\n"; }

実際に動かしてみよう

下のエディタにPHPを書いて「実行」を押すと、ブラウザ内で動く本物のPHP(php-wasm)で出力が表示されます。コードは必ず <?php で書き始めます。本文の例をそのまま試したり、書き換えたりしてみましょう(初回だけPHPの読み込みに少し時間がかかります)。

PHP — ブラウザ内で実行

ブラウザ内で動く本物のPHP(php-wasm / PHP 8.4)を読み込みます(初回のみ読み込みに少し時間がかかります)。
スクロールして表示された時点でも自動で読み込まれます。