Skip to main content
NewWebmaster.RU

Как читать и получать параметры URL в PHP

Оглавление:

Получение и извлечение параметров запроса URL в PHP

Что такое параметры URL / строки запроса?

Встроенный механизм PHP: $_GET

Извлечение из произвольной строки URL

Альтернатива с регулярными выражениями

Получение полного текущего URL

Вспомогательные функции

Пограничные случаи и лучшие практики

Резюме

Получение & извлечение параметров запроса URL в PHP

При создании веб-приложений на PHP часто возникает необходимость считывать значения, передаваемые через URL («строка запроса» или GET-параметры). В этой статье мы рассмотрим:

Что такое параметры 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);

Примечания:

Извлечение из произвольной строки 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);

Предостережения:

Альтернатива с регулярными выражениями

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Защищайтесь от некорректных входных данных.

Резюме