W3docs

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_COOKIECookies запроса ($_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']). Они похожи, но есть два реальных отличия:

  1. Источник данных. isset($_POST['x']) читает массив $_POST, который ваше приложение могло изменить или удалить. filter_has_var() смотрит на исходные данные запроса, зафиксированные PHP, поэтому его труднее «обмануть».
  2. Пустые значения всё равно считаются «присутствующими». Отправленное пустое значение (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(), когда пустое значение должно считаться отсутствующим.

Практика

Практика
Что делает PHP-функция filter_has_var()?
Что делает PHP-функция filter_has_var()?
Was this page helpful?