導入
第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"; }