[PHP]filter_var_array関数徹底解説 – 複数データの一括検証テクニック

PHP

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
)

実践的なヒントとテクニック

  1. カスタムバリデーション関数の活用
   $filters['password'] = [
       'filter' => FILTER_CALLBACK,
       'options' => function($password) {
           // 最低8文字、大文字・小文字・数字を含む
           return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/', $password) ? $password : false;
       }
   ];
  1. デフォルト値の設定
   $filters['items_per_page'] = [
       'filter' => FILTER_VALIDATE_INT,
       'options' => ['default' => 10, 'min_range' => 1, 'max_range' => 100]
   ];
  1. 配列入力の処理
   $data = ['tags' => ['php', 'coding', '<script>']];
   $filters = [
       'tags' => [
           'filter' => FILTER_SANITIZE_STRING,
           'flags' => FILTER_REQUIRE_ARRAY
       ]
   ];

まとめ

filter_var_array()は、複数のデータを一括で検証・サニタイズする強力なツールです。特に以下の場合に活用すると効果的です:

  • フォーム送信データの検証
  • APIからのレスポンスデータの検証
  • 設定ファイルの値のチェック
  • CSVインポートデータの検証

適切なフィルターとオプションを設定することで、データの整合性を効率的に確保し、安全なPHPアプリケーション開発が可能になります。

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