PHPでフォームデータなど複数の値を一度に検証したい場合に便利なfilter_var_array()
関数について、実例を交えながら詳しく解説します。
filter_var_arrayとは
filter_var_array()
は、配列の複数要素に対して一度にフィルターを適用できる関数です。フォーム送信データやAPIレスポンスなど、複数の値を同時に検証・サニタイズする際に非常に便利です。
基本構文
array filter_var_array ( array $array [, mixed $options [, bool $add_empty = true ]] )
基本的な使用例
例1: シンプルな配列のバリデーション
<?php
// 検証したい配列
$data = [
'email' => 'user@example.com',
'age' => '25',
'website' => 'https://example.com'
];
// 適用するフィルターの定義
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => FILTER_VALIDATE_INT,
'website' => FILTER_VALIDATE_URL
];
// フィルター適用
$filtered = filter_var_array($data, $filters);
print_r($filtered);
実行結果:
Array
(
[email] => user@example.com
[age] => 25
[website] => https://example.com
)
高度な使用例
例2: オプションを使った詳細な検証
<?php
$data = [
'username' => 'john_doe123',
'age' => '32',
'email' => 'contact@example.com',
'ip' => '192.168.1.1'
];
$filters = [
'username' => [
'filter' => FILTER_VALIDATE_REGEXP,
'options' => ['regexp' => '/^[a-zA-Z0-9_]{3,16}$/']
],
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 18, 'max_range' => 99]
],
'email' => FILTER_VALIDATE_EMAIL,
'ip' => [
'filter' => FILTER_VALIDATE_IP,
'flags' => FILTER_FLAG_IPV4
]
];
$filtered = filter_var_array($data, $filters);
print_r($filtered);
例3: フォームデータの実践的な処理
<?php
// $_POSTデータを想定
$form_data = [
'name' => ' John Smith ',
'email' => 'john.smith@example.com',
'age' => '28',
'comments' => '<script>alert("XSS");</script>Just a comment'
];
$filters = [
'name' => [
'filter' => FILTER_CALLBACK,
'options' => function($value) {
return trim(strip_tags($value));
}
],
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 0, 'max_range' => 120],
'flags' => FILTER_NULL_ON_FAILURE
],
'comments' => FILTER_SANITIZE_STRING // PHP 8.1以降では非推奨
];
$filtered = filter_var_array($form_data, $filters);
// PHP 8.1以降の代替方法
$safe_form_data = [
'name' => trim(strip_tags($form_data['name'])),
'email' => filter_var($form_data['email'], FILTER_VALIDATE_EMAIL),
'age' => filter_var($form_data['age'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120]
]),
'comments' => htmlspecialchars($form_data['comments'], ENT_QUOTES, 'UTF-8')
];
エラー処理のベストプラクティス
<?php
$data = [
'email' => 'invalid-email',
'age' => 'not-a-number',
'url' => 'example.com' // プロトコルがない
];
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => FILTER_VALIDATE_INT,
'url' => FILTER_VALIDATE_URL
];
$filtered = filter_var_array($data, $filters);
// 検証エラーの確認と処理
$errors = [];
foreach ($filtered as $field => $value) {
if ($value === false) {
$errors[$field] = "{$field}は無効な値です";
}
}
if (!empty($errors)) {
// エラーメッセージの表示
foreach ($errors as $field => $message) {
echo $message . "<br>";
}
} else {
echo "すべてのデータが有効です";
}
$add_empty パラメータの活用
<?php
$data = [
'name' => 'Tanaka',
// emailキーが存在しない
];
$filters = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL
];
// $add_empty = true (デフォルト)
$result1 = filter_var_array($data, $filters);
// $add_empty = false
$result2 = filter_var_array($data, $filters, false);
echo "デフォルト動作:\n";
print_r($result1);
echo "\n$add_empty = false の場合:\n";
print_r($result2);
出力:
デフォルト動作:
Array
(
[name] => Tanaka
[email] =>
)
$add_empty = false の場合:
Array
(
[name] => Tanaka
)
実践的なヒントとテクニック
- カスタムバリデーション関数の活用
$filters['password'] = [
'filter' => FILTER_CALLBACK,
'options' => function($password) {
// 最低8文字、大文字・小文字・数字を含む
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/', $password) ? $password : false;
}
];
- デフォルト値の設定
$filters['items_per_page'] = [
'filter' => FILTER_VALIDATE_INT,
'options' => ['default' => 10, 'min_range' => 1, 'max_range' => 100]
];
- 配列入力の処理
$data = ['tags' => ['php', 'coding', '<script>']];
$filters = [
'tags' => [
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY
]
];
まとめ
filter_var_array()
は、複数のデータを一括で検証・サニタイズする強力なツールです。特に以下の場合に活用すると効果的です:
- フォーム送信データの検証
- APIからのレスポンスデータの検証
- 設定ファイルの値のチェック
- CSVインポートデータの検証
適切なフィルターとオプションを設定することで、データの整合性を効率的に確保し、安全なPHPアプリケーション開発が可能になります。