前回はフォームからデータを受け取りましたが、もしユーザーが「何も書かずに送信ボタンを押したら」どうなるでしょう?
「〇〇さん、こんにちは」となるはずが、「さん、こんにちは」と表示されてしまいます。
システムによっては、これが原因でエラー停止することもあります。
そこで必要なのが、「入力チェック(バリデーション)」です。
「もし空欄だったら、エラーを表示する」という仕組みを作りましょう。
1. 空っぽ判定のプロ「empty()」
PHPには、「変数が空っぽかどうか」を調べる便利な関数 empty()(エンプティー) があります。
$name = $_POST['username'];
// もし $name が空っぽなら...
if (empty($name)) {
echo "名前を入力してください!";
} else {
echo "OKです!";
}
これを使えば、「必須項目」のチェックが簡単に作れます。
2. 黄金のロジックパターン
Webアプリの入力画面は、大体いつもこのパターンで作られています。
- まず、エラーを入れる配列
$errorsを用意する。 - もし名前が空なら、
$errorsにメッセージを追加する。 - もしメールが空なら、
$errorsにメッセージを追加する。 - 最後に
$errorsが空っぽなら(エラーがなければ)、完了画面へ進む。 - エラーがあれば、元の画面にメッセージを表示する。
この流れを覚えておくと、項目が10個に増えても対応できます。
3. 「入力した文字が消える問題」の解決
エラーが出て元の画面に戻った時、せっかく入力した内容が消えていたらイライラしますよね?
これを防ぐために、inputタグの value 属性に、入力された値を埋め込んでおきます。
<!-- valueの中にPHPで埋め込む! -->
<input type="text" name="username" value="<?= $username ?>">
これを「入力保持(Sticky Form)」と呼びます。
地味ですが、ユーザー体験(UX)において非常に重要です。
実践:エラー機能付きフォーム
では、名前と年齢を入力するフォームを作ってみましょう。
今回は「空欄チェック」と「入力保持」の両方を実装します。
<?php
// 変数の初期化(最初は空っぽにしておく)
$name = "";
$age = "";
$error_message = "";
// 送信ボタンが押された時だけ動く
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 入力値を受け取る
$name = $_POST['name'];
$age = $_POST['age'];
// === バリデーション(門番) ===
if (empty($name)) {
$error_message = "お名前を入力してください!";
} elseif (empty($age)) {
$error_message = "年齢を入力してください!";
} else {
// エラーがない時の処理
$success_message = "登録完了!{$name}さん({$age}歳)";
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>入力チェック</title>
<style>
.error { color: red; font-weight: bold; }
.success { color: green; font-weight: bold; border: 1px solid green; padding: 10px; }
</style>
</head>
<body>
<h1>会員登録</h1>
<!-- 成功メッセージがあれば表示 -->
<?php if (isset($success_message)): ?>
<div class="success">
<?= htmlspecialchars($success_message, ENT_QUOTES, 'UTF-8') ?>
</div>
<?php endif; ?>
<!-- エラーメッセージがあれば表示 -->
<?php if ($error_message): ?>
<p class="error">※ <?= $error_message ?></p>
<?php endif; ?>
<form action="" method="post">
<p>
名前:<br>
<!-- valueに入力値を埋め込んで、消えないようにする -->
<input type="text" name="name" value="<?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?>">
</p>
<p>
年齢:<br>
<input type="number" name="age" value="<?= htmlspecialchars($age, ENT_QUOTES, 'UTF-8') ?>">
</p>
<button type="submit">送信</button>
</form>
</body>
</html>
解説
empty($name): 名前が入っているかチェックします。$error_message: エラーがあったら、この変数に文字を入れます。- HTML側のif文:
$error_messageに中身がある時だけ、赤い文字を表示します。 value="...": 送信後に画面が再表示されても、入力した文字が残るようにしています。
まとめ
- 空欄チェックには
empty()を使う。 - エラー用の変数を用意して、HTML側で表示を切り替える。
value属性に入力値を戻してあげると親切。
これで、変なデータが送られてくるのを防げるようになりました。
次回は基礎編の最終回!
「PHP-4:メール送信とお問い合わせフォーム」です。
入力画面→確認画面→送信完了という、本格的な3画面構成に挑戦しましょう!
📝 今日のミニテスト
クリックで答え合わせ!
Q1. 変数の中身が「空っぽ」かどうかを調べる関数は?
正解:empty()
if (empty($var)) { ... } という書き方は鉄板です。
Q2. 送信エラー時に入力内容が消えないようにするテクニックを何という?
正解:入力保持(Sticky Form / スティッキーフォーム)
value 属性にPHPで値を埋め込むことで実現します。
Q3. isset() と empty() の違いは?
正解:issetは「存在するか」、emptyは「空かどうか」
フォームの未入力チェックには、空文字 "" も検知できる empty() の方が適しています。