[PHP]filter_input_array関数の使い方を完全解説!配列入力の一括検証方法

PHP

こんにちは!今回はPHPのfilter_input_array関数について、基本から実践的な使い方まで詳しく解説していきます。

1. filter_input_array関数の基本

構文

mixed filter_input_array ( int $type [, mixed $definition [, bool $add_empty = true ]] )

パラメータ

  • $type: 入力タイプ(INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV)
  • $definition: フィルター定義の配列
  • $add_empty: 存在しない要素を結果に含めるかどうか

2. 基本的な使用例

シンプルな例

// POSTデータの一括取得
$filters = [
    'username' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => FILTER_VALIDATE_INT
];

$result = filter_input_array(INPUT_POST, $filters);

オプション付きの例

$filters = [
    'username' => [
        'filter' => FILTER_SANITIZE_STRING,
        'flags' => FILTER_FLAG_STRIP_LOW
    ],
    'age' => [
        'filter' => FILTER_VALIDATE_INT,
        'options' => ['min_range' => 18, 'max_range' => 100]
    ],
    'email' => FILTER_VALIDATE_EMAIL
];

$result = filter_input_array(INPUT_POST, $filters);

3. 実践的な使用例

フォームバリデーションクラス

class FormValidator {
    private $filters;
    private $errors = [];

    public function __construct() {
        $this->filters = [
            'username' => [
                'filter' => FILTER_SANITIZE_STRING,
                'flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH
            ],
            'email' => [
                'filter' => FILTER_VALIDATE_EMAIL,
                'flags' => FILTER_FLAG_EMAIL_UNICODE
            ],
            'age' => [
                'filter' => FILTER_VALIDATE_INT,
                'options' => ['min_range' => 18, 'max_range' => 120]
            ],
            'website' => [
                'filter' => FILTER_VALIDATE_URL,
                'flags' => FILTER_FLAG_PATH_REQUIRED
            ]
        ];
    }

    public function validate() {
        $result = filter_input_array(INPUT_POST, $this->filters);

        foreach ($result as $field => $value) {
            if ($value === false || $value === null) {
                $this->errors[$field] = "Invalid {$field}";
            }
        }

        return [
            'data' => $result,
            'errors' => $this->errors,
            'is_valid' => empty($this->errors)
        ];
    }
}

APIパラメータの検証

function validateApiParams() {
    $filters = [
        'api_key' => FILTER_SANITIZE_STRING,
        'params' => [
            'filter' => FILTER_VALIDATE_INT,
            'flags' => FILTER_REQUIRE_ARRAY,
            'options' => ['min_range' => 1]
        ],
        'format' => [
            'filter' => FILTER_SANITIZE_STRING,
            'options' => ['default' => 'json']
        ]
    ];

    return filter_input_array(INPUT_GET, $filters);
}

4. エラーハンドリング

安全な入力処理

function safeInputArray($type, $definition) {
    try {
        $result = filter_input_array($type, $definition);

        if ($result === false || $result === null) {
            throw new Exception('入力データの処理に失敗しました');
        }

        $validated = [];
        $errors = [];

        foreach ($result as $key => $value) {
            if ($value === false || $value === null) {
                $errors[$key] = "{$key}の値が無効です";
            } else {
                $validated[$key] = $value;
            }
        }

        return [
            'success' => empty($errors),
            'data' => $validated,
            'errors' => $errors
        ];

    } catch (Exception $e) {
        error_log($e->getMessage());
        return [
            'success' => false,
            'error' => $e->getMessage()
        ];
    }
}

5. 高度な使用例

カスタムバリデーション

class AdvancedFormValidator {
    private $customFilters = [];

    public function addCustomFilter($name, $callback) {
        $this->customFilters[$name] = $callback;
    }

    public function validate($input_type, $definitions) {
        $result = filter_input_array($input_type, $definitions);

        foreach ($result as $field => $value) {
            if (isset($this->customFilters[$field])) {
                $result[$field] = call_user_func(
                    $this->customFilters[$field],
                    $value
                );
            }
        }

        return $result;
    }
}

// 使用例
$validator = new AdvancedFormValidator();

$validator->addCustomFilter('password', function($value) {
    return strlen($value) >= 8 && 
           preg_match('/[A-Z]/', $value) && 
           preg_match('/[0-9]/', $value);
});

6. パフォーマンス最適化

キャッシュを使用した実装

class CachedInputValidator {
    private static $cache = [];
    private static $cacheExpiry = 300; // 5分

    public static function validate($type, $definition) {
        $cacheKey = md5(serialize([$type, $definition]));

        if (isset(self::$cache[$cacheKey]) && 
            time() - self::$cache[$cacheKey]['time'] < self::$cacheExpiry) {
            return self::$cache[$cacheKey]['data'];
        }

        $result = filter_input_array($type, $definition);

        self::$cache[$cacheKey] = [
            'time' => time(),
            'data' => $result
        ];

        return $result;
    }
}

まとめ

filter_input_array関数の主なポイント:

  1. 複数の入力値を一度に検証できる
  2. カスタマイズ可能なフィルター定義
  3. エラーハンドリングが重要
  4. パフォーマンスを考慮した実装が可能
  5. セキュリティ対策として有効

注意点:

  • nullとfalseの戻り値の違いを理解する
  • 適切なフィルター定義を設計する
  • エラーチェックを忘れずに行う
  • パフォーマンスとメモリ使用量に注意する

ご質問やご不明な点がありましたら、お気軽にコメントください!

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