filter_var_array()
PHP предоставляет встроенную функцию filter_var_array() для фильтрации и валидации пользовательских данных сразу для нескольких переменных.
Введение
PHP предоставляет широкий набор встроенных функций для фильтрации и валидации пользовательских входных данных. Одной из таких функций является filter_var_array(), которая применяет фильтры сразу ко многим переменным, вместо того чтобы многократно вызывать filter_var(). Это главный инструмент для чистой обработки форм: вы описываете правила для каждого поля в одном array, передаёте в него необработанные входные данные и получаете полностью проверенный и очищенный результат.
В этой главе рассматриваются синтаксис, три способа задания фильтров, поведение флага $add_empty, порядок чтения возвращаемого значения и распространённые подводные камни — с рабочими примерами.
Синтаксис
Синтаксис filter_var_array() выглядит следующим образом:
Синтаксис PHP для filter_var_array()
filter_var_array ( array $data , mixed $definition [, bool $add_empty = true ] ) : mixed| Параметр | Описание |
|---|---|
$data | Ассоциативный array входных значений для фильтрации (например, $_POST или $_GET). |
$definition | Способ фильтрации. Либо одна константа фильтра, применяемая ко всем значениям, либо array, сопоставляющий каждый ключ с его собственным фильтром и параметрами. |
$add_empty | Если true (по умолчанию), ключи, присутствующие в $definition, но отсутствующие в $data, добавляются в результат со значением null. Если false, они пропускаются. |
Функция возвращает отфильтрованный array в случае успеха или false при ошибке (например, если $data не является array).
Три способа задания фильтров
Параметр $definition — это сердце данной функции. Он может принимать три формы.
1. Один фильтр для всех значений — передайте одну константу фильтра:
<?php
$data = ['a' => '1', 'b' => 'not-a-number', 'c' => '42'];
$result = filter_var_array($data, FILTER_VALIDATE_INT);
print_r($result);Вывод — значения, не прошедшие фильтр, становятся false:
Array
(
[a] => 1
[b] =>
[c] => 42
)2. Карта фильтров для каждого ключа — сопоставьте каждый ключ с собственной константой фильтра:
<?php
$data = [
'name' => ' John ',
'age' => '30',
'email' => '[email protected]',
];
$definition = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
];
print_r(filter_var_array($data, $definition));Array
(
[name] => John
[age] => 30
[email] => [email protected]
)3. Пер-ключевой array с фильтром, флагами и параметрами — для детального управления сопоставьте ключ с array, который содержит filter, flags и options:
<?php
$data = ['age' => '150', 'tags' => ['php', 'mysql']];
$definition = [
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 0, 'max_range' => 120],
],
'tags' => [
'filter' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'flags' => FILTER_REQUIRE_ARRAY,
],
];
var_dump(filter_var_array($data, $definition));array(2) {
["age"]=>
bool(false)
["tags"]=>
array(2) {
[0]=>
string(3) "php"
[1]=>
string(5) "mysql"
}
}age равно false, потому что 150 выходит за пределы диапазона 0–120, а FILTER_REQUIRE_ARRAY указывает фильтру обрабатывать tags как array и очищать каждый элемент.
Использование с данными формы
В реальном коде array $data обычно является суперглобальной переменной, такой как $_POST. Та же конфигурация, которую вы только что увидели, применяет правила и сохраняет очищенные значения в $result:
Пример PHP filter_var_array()
<?php
$filters = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
];
// $add_empty = false skips keys missing from $_POST instead of adding them as null
$result = filter_var_array($_POST, $filters, false);
if ($result === false || $result['email'] === false) {
// Handle missing or invalid input
echo 'Please correct the form.';
} else {
// $result now holds clean, validated values
}Обратите внимание, что неудачная проверка возвращает false для данного ключа, тогда как функция возвращает false целиком только в том случае, когда сам $data является недействительным. Всегда проверяйте оба случая. Для фильтрации $_POST или $_GET напрямую из входного потока смотрите тесно связанную функцию filter_input_array().
Примечание:
FILTER_SANITIZE_STRINGбыла удалена в PHP 8.0. Используйте вместо неёFILTER_SANITIZE_FULL_SPECIAL_CHARS.
Преимущества
Применение filter_var_array() повышает безопасность и надёжность вашего PHP-приложения за счёт обработки многих переменных в одном вызове. Валидация входных данных перед дальнейшей обработкой гарантирует, что приложение принимает только ожидаемые данные, снижая риск инъекций и ошибок, вызванных некорректными данными. Хранение правил в декларативном array $definition также отделяет валидацию от бизнес-логики, делая скрипты более модульными и удобными для сопровождения.
Заключение
filter_var_array() — это эффективный способ проверить и очистить целый набор переменных за один раз. Выберите форму определения фильтра, подходящую для ваших нужд: один фильтр для всех, карта по ключам или array параметров для каждого ключа — и всегда проверяйте false для каждого поля. Чтобы узнать больше, прочитайте главу Обзор фильтров PHP и главу Валидация форм PHP.