目次
1. 本記事のポイント
- PHPで複数入力項目のバリデーションを行う方法を紹介
- サーバーサイドでの安全なチェック処理の実装例を記載
- 実務で使える構造化されたバリデーション処理を解説
2. PHPフォームの多項目バリデーションとは?
Webフォームでは、名前・メールアドレス・パスワードなど複数項目の入力を一括して受け取るのが一般的です。それぞれの項目に対し、空欄チェックやフォーマット検証を行う必要があります。
このような入力値の検証処理を「バリデーション」と呼びます。クライアント側(JavaScript)での検証もありますが、信頼性確保のためには必ずサーバー側(PHP)でのバリデーションも必要です。
実務では、入力項目ごとに異なるルール(例:メール形式、文字数制限、数値チェックなど)を一括して処理するために、配列やルール定義による柔軟な設計が求められます。
本記事では、複数項目を安全にチェックし、エラーメッセージを集約して表示する基本的な方法を紹介します。
3. 詳細解説
シンプルな多項目バリデーションの例
以下は、名前・メール・年齢を対象にした基本的なバリデーションの例です。
PHP
<?php
// 入力データを想定(通常は $_POST を使用)
$data = [
'name' => '',
'email' => 'test@example',
'age' => 'abc'
];
$errors = [];
// name: 未入力チェック
if (empty($data['name'])) {
$errors['name'] = '名前は必須です';
}
// email: 形式チェック
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'メールアドレスの形式が不正です';
}
// age: 数値かどうかチェック
if (!ctype_digit($data['age'])) {
$errors['age'] = '年齢は整数で入力してください';
}
print_r($errors);
出力例:
PHP
Array
(
[name] => 名前は必須です
[email] => メールアドレスの形式が不正です
[age] => 年齢は整数で入力してください
)
このように、項目ごとのルールに応じて個別にチェックし、エラーを配列で管理する構成が基本となります。
構造化されたルール定義による柔軟な設計
より実務的には、ルールを配列で定義して動的にバリデーションを適用する設計が好まれます。
PHP
<?php
$rules = [
'name' => ['required'],
'email' => ['required', 'email'],
'age' => ['required', 'integer']
];
$data = [
'name' => '',
'email' => 'abc@',
'age' => '20a'
];
$errors = [];
foreach ($rules as $field => $ruleList) {
$value = $data[$field] ?? '';
foreach ($ruleList as $rule) {
if ($rule === 'required' && $value === '') {
$errors[$field] = '必須項目です';
break;
}
if ($rule === 'email' && !filter_var($value, FILTER_VALIDATE_EMAIL)) {
$errors[$field] = 'メール形式が不正です';
break;
}
if ($rule === 'integer' && !ctype_digit($value)) {
$errors[$field] = '整数で入力してください';
break;
}
}
}
print_r($errors);
この方法ではルールが分離されているため、再利用性や拡張性に優れています。
4. よくあるミス・誤解・落とし穴
- filter_varの型変換に注意:
FILTER_VALIDATE_INT
は数値文字列でなく数値型と判定されるため、入力が”20″のような文字列ではfalseになります。 - 未定義キーの扱い:
$_POST['key']
のように直接アクセスすると、未定義で警告が出ることがあります。??
(null合体演算子)を使うと安全です。 - 多言語対応:エラーメッセージの文言を直書きすると多言語化が困難になります。実務ではテンプレート化を検討すべきです。
5. まとめ
PHPでの多項目バリデーションは、ルール定義とチェック処理の分離により柔軟な設計が可能です。
filter_varやctype_digitなど標準関数を活用しつつ、未定義キーや出力形式にも注意が必要です。実務ではルールの管理性とメッセージの再利用性が重要な観点になります。