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

Работа с функцией filter_input в PHP: примеры и объяснения
Раздел: Фильтрация данных
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Функция filter_input в PHP

Назначение и применение

Функция filter_input используется для получения внешних переменных и их фильтрации. Она предоставляет безопасный способ доступа к данным из суперглобальных массивов, таким как $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV. Основное назначение — валидация и санитизация входных данных от пользователя или из окружения.

Аргументы функции

Функция принимает три аргумента:

  1. type — константа, определяющая тип входных данных: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV.
  2. variable_name — имя переменной, которую необходимо получить.
  3. filter — идентификатор фильтра, который будет применен к переменной. По умолчанию используется FILTER_DEFAULT.
  4. options — массив опций или битовая маска флагов. Необязательный параметр.

Возвращает значение переменной после фильтрации или null, если переменная не определена. В случае неудачи возвращает false.

Базовые примеры использования

Получение и фильтрация GET-параметра
<?php
// Пример URL: page.php?name=John123
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING);
echo $name;
?>
John123
Валидация email из POST-запроса
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    echo 'Некорректный email';
} else {
    echo $email;
}
?>
При значении 'user@example.com' — user@example.com
При значении 'invalid-email' — Некорректный email
Использование флагов для целых чисел
<?php
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 18, 'max_range' => 100]
]);
if ($age === false) {
    echo 'Возраст должен быть числом от 18 до 100';
} else {
    echo "Возраст: $age";
}
?>
При значении '25' — Возраст: 25
При значении '150' — Возраст должен быть числом от 18 до 100

Похожие функции в PHP

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

Функция filter_input_array позволяет получать и фильтровать несколько значений одновременно. Удобна при обработке форм с множеством полей.

Прямой доступ к суперглобальным массивам

Можно использовать прямые обращения, такие как $_GET['name'], но это менее безопасно, так как требует ручной проверки данных. Функции фильтрации предоставляют встроенные механизмы валидации и санитизации.

Аналоги в других языках

Python: модуль cgi или web frameworks
# Использование в Flask
from flask import request
from validators import email

email = request.form.get('email')
if email and email(email):
    print(email)
else:
    print('Invalid email')
Аналогичный результат, но требуется установка дополнительных библиотек.
JavaScript: проверка на клиенте
// Валидация email в JavaScript
function validateEmail(email) {
    const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return re.test(email);
}

console.log(validateEmail('test@example.com')); // true
console.log(validateEmail('invalid')); // false
true
false
MySQL: встроенные функции
-- Очистка данных при вставке
INSERT INTO users (name) VALUES (TRIM('  John  '));
Вставляет 'John' без пробелов.

Типичные ошибки

Неверный тип константы
<?php
// Использование несуществующей константы
$value = filter_input(INPUT_GET, 'param', 9999);
echo $value;
?>
Предупреждение и возврат null.
Отсутствие проверки на false
<?php
$number = filter_input(INPUT_GET, 'num', FILTER_VALIDATE_INT);
echo $number * 2; // Ошибка, если $number === false
?>
При 'abc' в параметре num — предупреждение о нечисловом значении.
Путаница между FILTER_VALIDATE и FILTER_SANITIZE
<?php
// FILTER_SANITIZE_NUMBER_INT удаляет все, кроме цифр и знаков +-
$sanitized = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_NUMBER_INT);
// FILTER_VALIDATE_INT проверяет, является ли значение целым числом
$validated = filter_input(INPUT_GET, 'code', FILTER_VALIDATE_INT);
echo "Sanitized: $sanitized\n";
echo "Validated: $validated";
?>
Для значения '123abc':
Sanitized: 123
Validated: false

Изменения в PHP 8

В PHP 8.1 поведение функции filter_input при передаче null в качестве параметра filter было изменено. Ранее это приводило к использованию фильтра по умолчанию, теперь вызывает ошибку TypeError.

<?php
// В PHP 8.0 и ранее:
$value = filter_input(INPUT_GET, 'test', null); // Работало
// В PHP 8.1 и выше:
$value = filter_input(INPUT_GET, 'test', null); // TypeError
?>
TypeError: filter_input(): Argument #3 ($filter) must be of type int, null given

Расширенные примеры

Фильтрация с кастомным callback
Пример php
<?php
$data = filter_input(INPUT_POST, 'custom', FILTER_CALLBACK, [
    'options' => function($value) {
        return strtoupper(trim($value));
    }
]);
echo $data; // Для ' hello ' выведет 'HELLO'
?>
HELLO
Работа с массивом значений
Пример php
<?php
$options = filter_input(INPUT_POST, 'options', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
if (is_array($options)) {
    foreach ($options as $option) {
        echo htmlspecialchars($option) . "\n";
    }
}
?>
Выводит каждый элемент массива, экранированный для HTML.
Комбинация флагов для email
Пример php
<?php
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE);
// FILTER_FLAG_EMAIL_UNICODE разрешает символы Unicode в email
var_dump($email);
?>
Для 'имя@домен.рф' вернет строку, для 'invalid' — false.
Фильтрация IP-адреса
Пример php
<?php
$ip = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
if ($ip) {
    echo "IP-адрес: $ip";
} else {
    echo 'Неверный IP';
}
?>
IP-адрес: 192.168.1.1 (пример)
Использование FILTER_NULL_ON_FAILURE
Пример php
<?php
$number = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
if (is_null($number)) {
    echo 'Переменная не установлена';
} elseif ($number === false) {
    echo 'Некорректное значение';
} else {
    echo "ID: $number";
}
?>
При отсутствии параметра id: Переменная не установлена
При значении 'abc': Некорректное значение
При значении '123': ID: 123

PHP filter_input function comments

En
Filter input Gets a specific external variable by name and optionally filters it