Как читать и получать параметры URL в PHP
Оглавление:
Получение и извлечение параметров запроса URL в PHP
Что такое параметры URL / строки запроса?
Встроенный механизм PHP: $_GET
Извлечение из произвольной строки URL
Альтернатива с регулярными выражениями
Получение полного текущего URL
Пограничные случаи и лучшие практики
Получение & извлечение параметров запроса URL в PHP #
При создании веб-приложений на PHP часто возникает необходимость считывать значения, передаваемые через URL («строка запроса» или GET-параметры). В этой статье мы рассмотрим:
Что такое параметры URL (строки запроса)
Как PHP предоставляет к ним доступ
Как анализировать параметры из строки URL
Полезные вспомогательные функции
Пограничные случаи, безопасность и лучшие практики
Что такое параметры URL / строки запроса? #
Параметр URL (или строка запроса) — это часть URL после символа ?
, где пары «ключ/значение» разделяются символом &
. Например:
https://example.com/search.php?q=php&lang=en&page=2
Здесь:
q
= php
lang
= en
page
= 2
Обычно к этим данным обращаются через HTTP GET. Они позволяют передавать небольшое количество данных прямо в самом URL.
Встроенный механизм PHP: $_GET
#
Самый простой и распространённый способ получения параметров URL в PHP — использование суперглобальной переменной $_GET
. Это ассоциативный массив, который PHP автоматически заполняет данными из строки запроса текущего запроса.
// Предположим, URL: http://mysite.com/page.php?user=alice&age=30
$user = $_GET['user']; // “alice”
$age = $_GET['age']; // “30”
// Лучше: проверить существование
if (isset($_GET['user'])) {
$user = $_GET['user'];
} else {
$user = null;
}
?>
Также можно использовать оператор объединения с null (PHP 7+):
$user = $_GET['user'] ?? null;
С фильтрацией:
$user = filter_input(INPUT_GET, 'user', FILTER_SANITIZE_STRING);
Примечания:
$_GET
работает при наличии строки запроса, независимо от метода запроса.Всегда проверяйте и очищайте данные.
Используйте
isset()
,??
илиfilter_input()
, чтобы избежать предупреждений.Массивы (например,
?arr[]=foo&arr[]=bar
) обрабатываются автоматически.
Извлечение из произвольной строки URL #
Иногда необходимо извлечь параметры из строки URL, а не из текущего запроса. В этом случае:
parse_url()
+ parse_str()
#
$url = "https://example.com/path?foo=bar&baz=qux&arr[]=one&arr[]=two";
$parts = parse_url($url);
if (!empty($parts['query'])) {
parse_str($parts['query'], $queryParams);
// [ "foo "= > "bar ", "baz "= > "qux ", "arr "= >[ "one ", "two "] ]
} else {
$queryParams = [];
}
?>
Или короче:
parse_str(parse_url($url, PHP_URL_QUERY), $queryParams);
Предостережения:
Не вызывайте
parse_str()
без второго аргумента — это загрязняет локальную область видимости.Пробелы и точки в ключах преобразуются в подчёркивания.
Количество обрабатываемых параметров может ограничиваться значением
max_input_vars
.
Альтернатива с регулярными выражениями #
if (preg_match("/[?&]foo=([^&]+)/", $url, $matches)) {
$fooVal = urldecode($matches[1]);
}
Но такой подход хрупкий, предпочтительнее использовать встроенные средства.
Получение полного текущего URL #
Если вам нужно получить полный URL текущего запроса:
<?php
function getCurrentUrl(): string {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http";
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
return $scheme . "://" . $host . $uri;
}
$current = getCurrentUrl();
echo $current;
?>
Это даёт результат вроде:
https://example.com/search.php?lang=en&q=php
Вспомогательные функции #
<?php
function getQueryParams(?string $url = null): array {
if ($url === null) {
$qs = $_SERVER['QUERY_STRING'] ?? '';
parse_str($qs, $params);
return $params;
}
$parts = parse_url($url);
if (empty($parts['query'])) {
return [];
}
parse_str($parts['query'], $params);
return $params;
}
function getParam(string $key, ?string $url = null, $default = null) {
$params = getQueryParams($url);
return $params[$key] ?? $default;
}
?>
Использование:
$params = getQueryParams("https://example.com/?a=1&b=2");
$email = getParam('email', null, '');
Пограничные случаи & лучшие практики #
Проблема | Рекомендация |
---|---|
Отсутствующие ключи | Используйте isset() , ?? или array_key_exists . |
Кодировка URL | Обрабатывается PHP автоматически. |
Повторяющиеся ключи | parse_str() сохраняет последнее значение, если не используется синтаксис [] . |
Большое количество параметров | Ограничено значением max_input_vars . |
Безопасность | Всегда проверяйте и очищайте входные данные. |
Некорректные URL | Защищайтесь от некорректных входных данных. |
Резюме #
Используйте
$_GET
для получения параметров текущего запроса.Используйте
parse_url()
+parse_str()
для анализа произвольных URL.Инкапсулируйте разбор в вспомогательных функциях.
Всегда проверяйте и очищайте входные данные.