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. Основное назначение — валидация и санитизация входных данных от пользователя или из окружения.
Функция принимает три аргумента:
- type — константа, определяющая тип входных данных: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV.
- variable_name — имя переменной, которую необходимо получить.
- filter — идентификатор фильтра, который будет применен к переменной. По умолчанию используется FILTER_DEFAULT.
- options — массив опций или битовая маска флагов. Необязательный параметр.
Возвращает значение переменной после фильтрации или null, если переменная не определена. В случае неудачи возвращает false.
Базовые примеры использования
<?php
// Пример URL: page.php?name=John123
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING);
echo $name;
?>John123
<?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'], но это менее безопасно, так как требует ручной проверки данных. Функции фильтрации предоставляют встроенные механизмы валидации и санитизации.
Аналоги в других языках
# Использование в 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')Аналогичный результат, но требуется установка дополнительных библиотек.
// Валидация 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')); // falsetrue false
-- Очистка данных при вставке
INSERT INTO users (name) VALUES (TRIM(' John '));Вставляет 'John' без пробелов.
Типичные ошибки
<?php
// Использование несуществующей константы
$value = filter_input(INPUT_GET, 'param', 9999);
echo $value;
?>Предупреждение и возврат null.
<?php
$number = filter_input(INPUT_GET, 'num', FILTER_VALIDATE_INT);
echo $number * 2; // Ошибка, если $number === false
?>При 'abc' в параметре num — предупреждение о нечисловом значении.
<?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
Расширенные примеры
<?php
$data = filter_input(INPUT_POST, 'custom', FILTER_CALLBACK, [
'options' => function($value) {
return strtoupper(trim($value));
}
]);
echo $data; // Для ' hello ' выведет 'HELLO'
?>HELLO
<?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.
<?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.
<?php
$ip = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
if ($ip) {
echo "IP-адрес: $ip";
} else {
echo 'Неверный IP';
}
?>IP-адрес: 192.168.1.1 (пример)
<?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