Функция GET в 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
Без параметра:
аноним