【PHP基礎-3】未入力を許さない!empty関数で作る「バリデーション」入門

前回はフォームからデータを受け取りましたが、もしユーザーが「何も書かずに送信ボタンを押したら」どうなるでしょう?

「〇〇さん、こんにちは」となるはずが、「さん、こんにちは」と表示されてしまいます。
システムによっては、これが原因でエラー停止することもあります。

そこで必要なのが、「入力チェック(バリデーション)」です。
「もし空欄だったら、エラーを表示する」という仕組みを作りましょう。

1. 空っぽ判定のプロ「empty()」

PHPには、「変数が空っぽかどうか」を調べる便利な関数 empty()(エンプティー) があります。

$name = $_POST['username'];

// もし $name が空っぽなら...
if (empty($name)) {
    echo "名前を入力してください!";
} else {
    echo "OKです!";
}

これを使えば、「必須項目」のチェックが簡単に作れます。

2. 黄金のロジックパターン

Webアプリの入力画面は、大体いつもこのパターンで作られています。

  1. まず、エラーを入れる配列 $errors を用意する。
  2. もし名前が空なら、$errors にメッセージを追加する。
  3. もしメールが空なら、$errors にメッセージを追加する。
  4. 最後に $errors が空っぽなら(エラーがなければ)、完了画面へ進む。
  5. エラーがあれば、元の画面にメッセージを表示する。

この流れを覚えておくと、項目が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>

解説

  1. empty($name) 名前が入っているかチェックします。
  2. $error_message エラーがあったら、この変数に文字を入れます。
  3. HTML側のif文: $error_message に中身がある時だけ、赤い文字を表示します。
  4. value="..." 送信後に画面が再表示されても、入力した文字が残るようにしています。

まとめ

  • 空欄チェックには empty() を使う。
  • エラー用の変数を用意して、HTML側で表示を切り替える。
  • value 属性に入力値を戻してあげると親切。

これで、変なデータが送られてくるのを防げるようになりました。
次回は基礎編の最終回!
「PHP-4:メール送信とお問い合わせフォーム」です。
入力画面→確認画面→送信完了という、本格的な3画面構成に挑戦しましょう!

📝 今日のミニテスト

クリックで答え合わせ!

Q1. 変数の中身が「空っぽ」かどうかを調べる関数は?

正解:empty()
if (empty($var)) { ... } という書き方は鉄板です。

 

Q2. 送信エラー時に入力内容が消えないようにするテクニックを何という?

正解:入力保持(Sticky Form / スティッキーフォーム)
value 属性にPHPで値を埋め込むことで実現します。

 

Q3. isset()empty() の違いは?

正解:issetは「存在するか」、emptyは「空かどうか」
フォームの未入力チェックには、空文字 "" も検知できる empty() の方が適しています。

タイトルとURLをコピーしました