PHPのフォームバリデーション入門!入力値をチェックする基本を解説

ユーザーが情報を入力するフォームは、Webアプリケーションの心臓部です。しかし、ユーザーが何も入力しなかったり、想定外の長い文字列を入力したりする可能性は常にあります。

このような意図しないデータからシステムを守り、ユーザーに正しい入力を促すための仕組みが「バリデーション(入力値検証)」です。

今回は、1つのPHPファイルの中でフォームの表示とバリデーション処理を完結させる方法を、初心者の方にも分かりやすく解説します。


目次

バリデーションとは?なぜ必要なの?

バリデーションとは、ユーザーがフォームから送信したデータが、私たちが設定したルール(仕様)に合っているかをチェックする処理のことです。

【バリデーションの例】

  • 必須項目が空っぽではないか?
  • パスワードは8文字以上か?
  • メールアドレスの形式は正しいか?
  • 入力された値は数値か?

もしバリデーションがなければ、空のデータがデータベースに登録されたり、長すぎるデータでレイアウトが崩れたり、最悪の場合はシステムエラーやセキュリティ上の問題を引き起こす可能性があります。

安全で使いやすいWebアプリケーションを作るために、バリデーションは不可欠な機能なのです。


1ファイルで完結するバリデーションの仕組み

今回は、1つのPHPファイル(register.phpなど)に「フォーム表示」と「データチェック処理」の両方を記述します。

  1. 初回アクセス時(GETリクエスト): ユーザーが最初にページを開いたときは、入力フォームを表示します。
  2. フォーム送信時(POSTリクエスト): ユーザーがフォームの送信ボタンを押すと、ページは自分自身にデータを送信します。PHPはPOSTリクエストを受け取り、バリデーション処理を実行します。

この流れを実現するために、まずは「今が初回アクセスなのか、それともフォーム送信時なのか」をPHPに判断させる必要があります。


バリデーション機能の実装ステップ

ニックネームの登録フォームを例に、バリデーション機能を実装する手順を見ていきましょう。 ルールは以下の2つです。

  1. ニックネームは必須入力とする。
  2. ニックネームは10文字以内とする。

ステップ1:POSTリクエストか判定する

PHPの$_SERVER['REQUEST_METHOD']という特別な変数を使うと、現在のリクエストが'GET'なのか'POST'なのかを判別できます。これを使って、フォームが送信されたときだけ処理が動くようにします。

<?php
// 変数を初期化
$nickname = '';
$error_message = '';

// POSTリクエストがあった場合のみ、バリデーション処理を実行
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // この中にデータチェックの処理を書いていく
}
?>

最初に変数を空の状態で初期化しておくことで、初回アクセス時に「そんな変数は存在しません」というエラー(Undefined Notice)が出るのを防ぐことができます。

ステップ2:入力値をチェックする

if文のブロックの中に、具体的なチェック処理を記述していきます。

  • 未入力チェック: mb_strlen()関数で、マルチバイト文字(日本語など)を考慮した文字数を取得します。文字数が0であれば未入力と判断できます。
  • 文字数チェック: 同様にmb_strlen()で文字数を取得し、ルール(10文字以内)を超えていないかをチェックします。
<?php
// ...
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nickname = $_POST['nickname'] ?? '';

    // 未入力チェック
    if (mb_strlen($nickname) === 0) {
        $error_message = 'ニックネームを入力してください。';
    // 文字数チェック (10文字を超えているか)
    } elseif (mb_strlen($nickname) > 10) {
        $error_message = 'ニックネームは10文字以内で入力してください。';
    }
}
?>

ステップ3:エラーの有無で表示を分岐する

バリデーション処理の結果(エラーメッセージがあるか、ないか)によって、HTMLの表示内容を切り替えます。

  • エラーがある場合: フォームと共にエラーメッセージを表示します。
  • エラーがない場合(正常): 「登録ありがとうございます」といった成功メッセージを表示します。

完成コード

これまでのステップをすべて統合した完成コードです。このコードを1つのPHPファイルとして保存すれば、すぐに動作を確認できます。

<?php
// ===== 変数の初期化 =====
$nickname = '';
$error_message = '';
$success_message = '';

// ===== POSTリクエストがあった場合の処理 =====
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // POSTされたニックネームを取得(未定義の場合に備えて空文字をデフォルトに)
    $nickname = $_POST['nickname'] ?? '';

    // ===== バリデーション =====
    // 1. 未入力チェック
    if (mb_strlen($nickname) === 0) {
        $error_message = 'ニックネームを入力してください。';
    // 2. 文字数チェック (10文字を超える場合)
    } elseif (mb_strlen($nickname) > 10) {
        $error_message = 'ニックネームは10文字以内で入力してください。';
    // エラーがなかった場合(正常処理)
    } else {
        // XSS対策のため、表示する前にhtmlspecialchars()を通す
        $escaped_nickname = htmlspecialchars($nickname, ENT_QUOTES, 'UTF-8');
        $success_message = "ようこそ、{$escaped_nickname}さん!登録が完了しました。";
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>バリデーションのサンプル</title>
    <style>
        body { font-family: sans-serif; text-align: center; }
        .container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
        .error { color: #d9534f; }
        .success { color: #5cb85c; }
        input[type="text"] { margin: 10px 0; padding: 8px; width: 80%; }
        input[type="submit"] { padding: 10px 20px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>ニックネーム登録</h1>

        <?php if (!empty($error_message)): ?>
            <p class="error"><?php echo $error_message; ?></p>
        <?php endif; ?>

        <?php if (!empty($success_message)): ?>
            <p class="success"><?php echo $success_message; ?></p>
        <?php else: ?>
            <form action="" method="POST">
                <label for="nickname">ニックネーム (10文字以内)</label><br>
                <input type="text" id="nickname" name="nickname" value="<?php echo htmlspecialchars($nickname, ENT_QUOTES, 'UTF-8'); ?>">
                <br>
                <input type="submit" value="登録する">
            </form>
        <?php endif; ?>
    </div>
</body>
</html>

まとめ

今回は、PHPによるフォームバリデーションの基本を学びました。

【ポイントの振り返り】

  • バリデーションは、不正なデータからシステムを守るために不可欠な処理。
  • $_SERVER['REQUEST_METHOD']で、POSTリクエスト時のみ処理を実行する。
  • mb_strlen()などでルールに合っているかチェックし、エラーメッセージを変数に格納する。
  • エラーの有無によって、表示するHTMLを分岐させる。

ここで紹介したのは、未入力と文字数チェックという基本的なバリデーションだけです。実際の開発では、メールアドレス形式のチェック、数値かどうかのチェックなど、より多くの検証が必要になります。

まずはこの基本形をしっかりとマスターし、安全なアプリケーション開発の第一歩を踏み出しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次