Функция GET в PHP - как извлекать и валидировать параметры строки запроса

Раздел: PHP -> веб-разработка

Основные принципы работы с GET-параметрами

В PHP данные из строки запроса URL доступны через суперглобальный массив $_GET. Каждый параметр, переданный через URL после знака вопроса, становится элементом этого массива. Понимание механизмов извлечения и обработки таких данных необходимо для создания безопасных и надёжных веб-приложений.

Наиболее эффективный способ получения GET-параметра с проверкой и санитацией - использование функции filter_input() с указанием типа фильтра. Например, для получения целочисленного параметра id:

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

Этот код возвращает целое число, если параметр существует и является валидным целым, иначе false. Такой подход предотвращает ошибки доступа к несуществующим ключам и автоматически проверяет тип данных.

Как получить значение параметра с проверкой его существования?

Прямое обращение $_GET['param'] может вызвать предупреждение Undefined index, если ключ отсутствует. Рекомендуемый способ - использование isset():

if (isset($_GET['name'])) {
    $name = $_GET['name'];
}

Можно также применить оператор объединения с null (??) для задания значения по умолчанию:

$name = $_GET['name'] ?? 'гость';

Как обработать массив параметров, переданных в URL?

Если в URL указано ?items[]=1&items[]=2, то $_GET['items'] будет массивом. Доступ к элементам осуществляется как к обычному массиву:

$items = $_GET['items'] ?? [];
foreach ($items as $item) {
    echo htmlspecialchars($item);
}

Как получить все переданные GET-параметры сразу?

Массив $_GET содержит все параметры. Для просмотра можно использовать print_r():

echo '<pre>';
print_r($_GET);
echo '</pre>';

Такой подход удобен для отладки, но не рекомендуется для рабочего кода из‑за потенциальной утечки данных.

Как защитить вывод GET-параметров от XSS-атак?

Любые данные, полученные из $_GET, перед выводом на страницу необходимо экранировать. Функция htmlspecialchars() преобразует специальные символы в HTML-сущности:

$name = htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
echo "Привет, $name";

Как проверить, что параметр является числом, и безопасно использовать его?

Помимо filter_input() можно использовать ctype_digit() или is_numeric() после проверки существования:

if (isset($_GET['page']) && ctype_digit($_GET['page'])) {
    $page = (int)$_GET['page'];
} else {
    $page = 1;
}

Такой способ гарантирует, что в переменную попадёт только целое положительное число.

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

  • Undefined index: возникает при обращении к несуществующему ключу. Решение - проверка через isset() или filter_input().
  • XSS-уязвимости: вывод непроверенных GET-данных. Используется htmlspecialchars() перед выводом.
  • Неверный тип данных: ожидание числа, а получена строка. Применение фильтров валидации (FILTER_VALIDATE_INT, FILTER_VALIDATE_EMAIL и т.д.).
  • Пробелы и кодировка: параметры могут содержать URL-кодированные символы. PHP автоматически декодирует их, но при необходимости можно использовать urldecode().

Пример 1: Валидация целочисленного идентификатора с filter_input

Данный пример показывает, как корректно получить и проверить параметр id из URL.

Пример
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
    $id = 0;
}
echo "ID: $id";

Результат при вызове ?id=42:

ID: 42

Результат при вызове ?id=abc или без параметра:

ID: 0

Пример 2: Обработка нескольких параметров и построение условного запроса

Предположим, что URL содержит параметры category и sort. Их значения используются для построения SQL-запроса (с подготовленными выражениями!).

Пример
$category = filter_input(INPUT_GET, 'category', FILTER_VALIDATE_INT, ['options' => ['default' => 0]]);
$sort = $_GET['sort'] ?? 'name';
$allowedSorts = ['name', 'price', 'date'];
if (!in_array($sort, $allowedSorts)) {
    $sort = 'name';
}
echo "Category: $category, Sort: $sort";

Вызов ?category=5&sort=price:

Category: 5, Sort: price

Вызов ?category=abc&sort=invalid:

Category: 0, Sort: name

Пример 3: Разбор строки запроса с помощью parse_str

Функция parse_str() позволяет разобрать произвольную строку запроса (например, полученную из другого источника) в массив.

Пример
$queryString = 'search=php+functions&page=2&limit=10';
parse_str($queryString, $params);
print_r($params);

Результат:

Array
(
    [search] => php functions
    [page] => 2
    [limit] => 10
)

Обратите внимание, что PHP автоматически декодирует URL-кодированные пробелы (+ превращается в пробел).

Пример 4: Редирект с сохранением текущих GET-параметров

Если необходимо перенаправить пользователя на другую страницу, но при этом передать все или часть текущих GET-параметров, можно собрать новую строку запроса.

Пример
$baseUrl = 'https://example.com/new-page';
$allowedParams = ['id', 'token'];
$query = http_build_query(array_intersect_key($_GET, array_flip($allowedParams)));
if ($query) {
    $baseUrl .= '?' . $query;
}
header('Location: ' . $baseUrl);
exit;

Этот код берёт из текущего запроса только параметры id и token (если они есть) и формирует URL для редиректа.

Пример 5: Фильтрация массива параметров с помощью filter_input_array

Когда нужно обработать сразу несколько GET-параметров, удобно использовать filter_input_array().

Пример
$args = [
    'name' => FILTER_SANITIZE_STRING,
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 150]]
];
$result = filter_input_array(INPUT_GET, $args);
print_r($result);

Если в URL передать ?name=John&email=john@example.com&age=30, результат будет:

Array
(
    [name] => John
    [email] => john@example.com
    [age] => 30
)

При невалидном email параметр email будет false.

Пример 6: Получение параметра с обработкой ошибок через try-catch

Хотя прямой доступ к $_GET['key'] не выбрасывает исключение, можно эмулировать проверку с помощью пользовательского кода.

Пример
function getGetParam(string $key, $default = null) {
    return isset($_GET[$key]) ? $_GET[$key] : $default;
}
echo getGetParam('user', 'аноним');

При вызове ?user=Alice:

Alice

Без параметра:

аноним

функция GET в PHP - comments

En
Php function get (php)