こんにちは!今回は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関数の主なポイント:
- 複数の入力値を一度に検証できる
- カスタマイズ可能なフィルター定義
- エラーハンドリングが重要
- パフォーマンスを考慮した実装が可能
- セキュリティ対策として有効
注意点:
- nullとfalseの戻り値の違いを理解する
- 適切なフィルター定義を設計する
- エラーチェックを忘れずに行う
- パフォーマンスとメモリ使用量に注意する
ご質問やご不明な点がありましたら、お気軽にコメントください!