Как читать и получать параметры 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.Инкапсулируйте разбор в вспомогательных функциях.
Всегда проверяйте и очищайте входные данные.
