ユーザーが情報を入力するフォームは、Webアプリケーションの心臓部です。しかし、ユーザーが何も入力しなかったり、想定外の長い文字列を入力したりする可能性は常にあります。
このような意図しないデータからシステムを守り、ユーザーに正しい入力を促すための仕組みが「バリデーション(入力値検証)」です。
今回は、1つのPHPファイルの中でフォームの表示とバリデーション処理を完結させる方法を、初心者の方にも分かりやすく解説します。
バリデーションとは?なぜ必要なの?
バリデーションとは、ユーザーがフォームから送信したデータが、私たちが設定したルール(仕様)に合っているかをチェックする処理のことです。
【バリデーションの例】
- 必須項目が空っぽではないか?
- パスワードは8文字以上か?
- メールアドレスの形式は正しいか?
- 入力された値は数値か?
もしバリデーションがなければ、空のデータがデータベースに登録されたり、長すぎるデータでレイアウトが崩れたり、最悪の場合はシステムエラーやセキュリティ上の問題を引き起こす可能性があります。
安全で使いやすいWebアプリケーションを作るために、バリデーションは不可欠な機能なのです。
1ファイルで完結するバリデーションの仕組み
今回は、1つのPHPファイル(register.php
など)に「フォーム表示」と「データチェック処理」の両方を記述します。
- 初回アクセス時(GETリクエスト): ユーザーが最初にページを開いたときは、入力フォームを表示します。
- フォーム送信時(POSTリクエスト): ユーザーがフォームの送信ボタンを押すと、ページは自分自身にデータを送信します。PHPはPOSTリクエストを受け取り、バリデーション処理を実行します。
この流れを実現するために、まずは「今が初回アクセスなのか、それともフォーム送信時なのか」をPHPに判断させる必要があります。
バリデーション機能の実装ステップ
ニックネームの登録フォームを例に、バリデーション機能を実装する手順を見ていきましょう。 ルールは以下の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を分岐させる。
ここで紹介したのは、未入力と文字数チェックという基本的なバリデーションだけです。実際の開発では、メールアドレス形式のチェック、数値かどうかのチェックなど、より多くの検証が必要になります。
まずはこの基本形をしっかりとマスターし、安全なアプリケーション開発の第一歩を踏み出しましょう。