filter_has_var()
Подробное руководство по PHP-функции filter_has_var(): синтаксис, константы источников ввода и отличия от isset().
filter_has_var() проверяет, существует ли переменная из определённого источника входных данных (GET, POST, cookies, сервер или окружение). На этой странице рассматриваются синтаксис, константы источников ввода, отличия от isset() и типичные ошибки, которые допускают разработчики.
Что делает filter_has_var()
filter_has_var() отвечает на один вопрос: действительно ли этот источник ввода прислал переменную с данным именем? Функция возвращает true или false.
Она не читает значение, не очищает и не проверяет его — для этого используйте filter_input() или filter_var(). Воспринимайте filter_has_var() как проверку наличия, которая смотрит на исходный входной поток, а не на суперглобальные переменные $_GET / $_POST, которые ваш код мог изменить во время выполнения.
Синтаксис
filter_has_var(int $input_type, string $var_name): bool| Параметр | Описание |
|---|---|
$input_type | Источник ввода для поиска. Одна из констант INPUT_*, приведённых ниже. |
$var_name | Имя переменной, наличие которой нужно проверить. |
Функция возвращает true, если переменная с именем $var_name присутствует в указанном источнике ввода, и false в противном случае.
Константы источников ввода
| Константа | Источник |
|---|---|
INPUT_GET | Параметры строки запроса ($_GET) |
INPUT_POST | Тело формы ($_POST) |
INPUT_COOKIE | Cookies запроса ($_COOKIE) |
INPUT_SERVER | Переменные сервера ($_SERVER) |
INPUT_ENV | Переменные окружения ($_ENV) |
Важно:
INPUT_REQUESTиINPUT_SESSIONопределены как константы, но не реализованы. Их передача всегда возвращаетfalse. Используйте вместо них явноINPUT_GET/INPUT_POST.
Базовый пример
Представьте запрос вида [email protected]. Вы можете проверить, какие параметры строки запроса были переданы:
<?php
// Given the query string: [email protected]
var_dump(filter_has_var(INPUT_GET, 'email')); // bool(true) — sent
var_dump(filter_has_var(INPUT_GET, 'username')); // bool(false) — not sentВывод (при реальном обращении к серверу с таким запросом):
bool(true)
bool(false)Важно:
filter_has_var()проверяет данные, которые PHP зафиксировал в начале запроса, а не текущее содержимое суперглобальных переменных$_GET/$_POST. Присваивание значений$_GETпозже в скрипте не влияет на то, что видитfilter_has_var(). Это также означает, что при запуске PHP из командной строки функция возвращаетfalseдля всего, поскольку HTTP-запроса для чтения нет.
Проверка наличия отправленного поля
Наиболее распространённое применение — защита обработки формы: убедитесь, что поле существует, прежде чем пытаться его проверить. Здесь filter_has_var() позволяет различить «поле отсутствует» и «поле присутствует, но содержит некорректное значение».
<?php
if (filter_has_var(INPUT_POST, 'email')) {
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email !== false && $email !== null) {
echo "Valid email: $email";
} else {
echo 'Invalid email address.';
}
} else {
echo 'Email field is missing.';
}Если поле email вообще не появляется в теле POST-запроса, выполняется ветка «отсутствует». Если оно присутствует, но имеет неверный формат, filter_input() возвращает false и выполняется ветка «некорректное значение».
filter_has_var() vs. isset()
Часто спрашивают, почему бы просто не использовать isset($_POST['email']). Они похожи, но есть два реальных отличия:
- Источник данных.
isset($_POST['x'])читает массив$_POST, который ваше приложение могло изменить или удалить.filter_has_var()смотрит на исходные данные запроса, зафиксированные PHP, поэтому его труднее «обмануть». - Пустые значения всё равно считаются «присутствующими». Отправленное пустое значение (
newsletter=) существует, поэтомуfilter_has_var()возвращаетtrue. Если нужно проверить «присутствует и не пустое», проверьте значение с помощьюempty():
<?php
// Simulate a present-but-empty submitted field.
$_GET['newsletter'] = '';
var_dump(isset($_GET['newsletter'])); // bool(true) — the key exists
var_dump(empty($_GET['newsletter'])); // bool(true) — but the value is emptyВывод:
bool(true)
bool(true)Таким образом, filter_has_var() подтверждает наличие; используйте его вместе с empty(), когда пустая string должна считаться «не предоставленной».
Зачем использовать
- Ясное намерение. Функция документирует, что ветка кода зависит от конкретного источника ввода, а не от того, что случайно оказалось в суперглобальной переменной.
- Более надёжная защита. Чтение исходного входного потока исключает ложноположительные результаты из-за переменных, добавленных вашим собственным кодом во время выполнения.
- Модульная валидация. Разделение проверки наличия (
filter_has_var()) и проверки значения (filter_input()/filter_var()) делает логику валидации модульной и удобочитаемой, что снижает риск принятия неожиданных входных данных, ведущих к таким проблемам, как SQL-инъекция или XSS.
Заключение
filter_has_var() — это целенаправленная проверка наличия для входных данных запроса: она сообщает, была ли отправлена переменная INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER или INPUT_ENV, и больше ничего. Комбинируйте её с filter_input() или filter_var() для проверки значения, а также с empty(), когда пустое значение должно считаться отсутствующим.