Filter input array: примеры (PHP)

Работа с функцией filter_input_array в современных версиях PHP
Раздел: Фильтрация данных
filter_input_array(int $type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null
Основные сведения о filter_input_array

Функция filter_input_array предназначена для получения нескольких внешних переменных и их фильтрации по заданным правилам. Она часто применяется при обработке данных форм, параметров запросов или значений кук, обеспечивая безопасность и валидацию.

Функция используется для одновременной обработки группы входных данных, что упрощает код и снижает вероятность ошибок.

Аргументы функции
  • type - тип входных данных (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV).
  • options - массив, определяющий правила фильтрации для каждого поля. Может быть ассоциативным массивом, где ключи - имена переменных, а значения - ID фильтров, флаги или массив с параметрами фильтра.
  • add_empty - необязательный булевый параметр. Если установлен в true, в результат добавляются поля, отсутствующие во входных данных, со значением null.
Простые примеры использования
Фильтрация GET-параметров

Обработка числового 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"
Похожие функции в PHP

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

В 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
<?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
<?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
<?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 {
    // Все данные корректны
}
?>

PHP filter_input_array function comments

En
Filter input array Gets external variables and optionally filters them