Filter input array: примеры (PHP)
filter_input_array(int $type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|nullФункция filter_input_array предназначена для получения нескольких внешних переменных и их фильтрации по заданным правилам. Она часто применяется при обработке данных форм, параметров запросов или значений кук, обеспечивая безопасность и валидацию.
Функция используется для одновременной обработки группы входных данных, что упрощает код и снижает вероятность ошибок.
- type - тип входных данных (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV).
- options - массив, определяющий правила фильтрации для каждого поля. Может быть ассоциативным массивом, где ключи - имена переменных, а значения - ID фильтров, флаги или массив с параметрами фильтра.
- add_empty - необязательный булевый параметр. Если установлен в true, в результат добавляются поля, отсутствующие во входных данных, со значением null.
Обработка числового ID и строкового имени:
<?php
// Предположим, URL: ?id=123&name=Test
$filters = [
'id' => FILTER_VALIDATE_INT,
'name' => FILTER_SANITIZE_STRING
];
$result = filter_input_array(INPUT_GET, $filters);
print_r($result);
?>Array
(
[id] => 123
[name] => Test
)Валидация email с требованием наличия домена:
<?php
// Данные POST: email=user@example.com
$options = [
'email' => [
'filter' => FILTER_VALIDATE_EMAIL,
'flags' => FILTER_FLAG_EMAIL_UNICODE
]
];
$filtered = filter_input_array(INPUT_POST, $options);
var_dump($filtered['email']);
?>string(16) "user@example.com"
filter_input - обрабатывает одиночную переменную. Предпочтительна для единичных значений.
filter_var_array - фильтрует массив переменных, но не привязана к конкретному источнику (GET, POST). Используется для данных, уже извлеченных из суперглобальных массивов.
filter_var - применяет фильтр к одной переменной. Подходит для простых случаев валидации или санации.
Выбор зависит от источника данных и количества обрабатываемых переменных. Для групп внешних данных удобнее filter_input_array.
Filter input array в Python
Используются библиотеки или встроенные механизмы валидации, например, модуль 'json' для парсинга или 'cgi' для работы с формами:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
# Валидация происходит автоматически при вызове form.is_valid()Filter input array в Javascript
Валидация часто выполняется на стороне клиента или с помощью библиотек:
// Пример с использованием библиотеки Yup
const yup = require('yup');
let schema = yup.object().shape({
name: yup.string().required(),
age: yup.number().positive().integer()
});
schema.validate({ name: 'John', age: 30 });Filter input array в MySQL
Используются встроенные функции для проверки и преобразования данных, например, CAST или REGEXP:
SELECT CAST('123' AS UNSIGNED); -- Возвращает число 123Если поле не передано, по умолчанию оно не попадает в результат:
<?php
// URL не содержит параметр 'age'
$filters = ['age' => FILTER_VALIDATE_INT];
$result = filter_input_array(INPUT_GET, $filters);
var_dump($result);
?>array(0) { }Для включения отсутствующих полей используется параметр add_empty:
<?php
$result = filter_input_array(INPUT_GET, $filters, true);
var_dump($result);
?>array(1) { ["age"]=> NULL }Использование несовместимых флагов приводит к неожиданным результатам:
<?php
$options = [
'number' => [
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FLAG_EMAIL_UNICODE // Неверный флаг
]
];
$filtered = filter_input_array(INPUT_GET, $options);
// Флаг игнорируется
?>В PHP 8.0 поведение функции было уточнено. При передаче неверного типа аргумента теперь выбрасывается TypeError вместо предупреждения.
В PHP 8.1 добавлена поддержка нового фильтра FILTER_VALIDATE_BOOL, который является синонимом FILTER_VALIDATE_BOOLEAN, но рекомендуется к использованию.
Ранее, в PHP 7.0, были добавлены константы FILTER_FLAG_EMAIL_UNICODE и FILTER_SANITIZE_ADD_SLASHES.
Функция может обрабатывать поля с индексами, например, данные из формы с массивом:
<?php
// Данные POST: items[0]=10&items[1]=20
$options = [
'items' => [
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
'options' => ['min_range' => 1]
]
];
$filtered = filter_input_array(INPUT_POST, $options);
print_r($filtered);
?>Array
(
[items] => Array
(
[0] => 10
[1] => 20
)
)Для одного поля можно задать цепочку фильтров через массив:
<?php
// URL: ?text=<script>alert('test')</script>
$options = [
'text' => [
'filter' => FILTER_CALLBACK,
'options' => function($value) {
$value = filter_var($value, FILTER_SANITIZE_STRING);
return strip_tags($value);
}
]
];
$result = filter_input_array(INPUT_GET, $options);
echo $result['text'];
?>alert('test')Можно проверить результат и обработать невалидные данные:
<?php
$filters = [
'id' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL
];
$input = filter_input_array(INPUT_POST, $filters);
if ($input === false || in_array(false, $input, true)) {
echo 'Обнаружены невалидные данные';
} else {
// Все данные корректны
}
?>