URL параметры в PHP: практическое применение и примеры

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

Основы работы с query string в PHP

Query string (строка запроса) в URL располагается после знака ? и содержит пары ключ=значение, разделённые &. В PHP для её обработки служит суперглобальный массив $_GET, но для безопасного и гибкого использования рекомендуется применять функции фильтрации и валидации.

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


$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
if ($page === false || $page === null) {
    $page = 1;
}
  

Php создание ссылки (создание ссылки в php)

Этот метод автоматически проверяет существование ключа, отсекает вредоносные данные и возвращает значение нужного типа. Для строковых параметров применяют FILTER_SANITIZE_STRING (в PHP 8.1+ используйте FILTER_SANITIZE_FULL_SPECIAL_CHARS).

Цель: обеспечить безопасность при получении данных из URL, избежать ошибок при отсутствии параметра и гарантировать корректный тип.

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

Самый простой способ - массив $_GET. PHP автоматически парсит query string и помещает результат в этот суперглобал:


// URL: example.com?name=John&age=25
echo $_GET['name']; // John
echo $_GET['age'];  // 25
var_dump($_GET);
  

Php текущая url (текущая url в php)

Но прямой доступ без проверки может вызвать ошибку Undefined array key. Поэтому всегда используйте isset() или оператор ??:


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

Mobile php url (мобильный url в php)

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

Функция parse_str() превращает строку с параметрами в ассоциативный массив:


$query = 'product_id=123&color=red&size=XL';
parse_str($query, $result);
print_r($result);
/* 
Array
(
    [product_id] => 123
    [color] => red
    [size] => XL
)
*/
  

Php open url (открытие url в php)

Это удобно, когда нужно обработать строку запроса из другого источника (например, из реферера или из тела POST-запроса).

Как разбить URL на компоненты и извлечь query string отдельно?

Используйте parse_url() с константой PHP_URL_QUERY:


$url = 'https://example.com/search?q=php&lang=ru';
$queryString = parse_url($url, PHP_URL_QUERY);
echo $queryString; // q=php&lang=ru
parse_str($queryString, $params);
print_r($params);
// ['q' => 'php', 'lang' => 'ru']
  

Js php url (javascript и php url)

Цель: извлекать query string из полного URL, когда нужно изменить только часть запроса или выполнить редирект.

Как собрать query string из массива параметров?

Функция http_build_query() формирует строку запроса из ассоциативного массива, автоматически кодируя спецсимволы:


$params = [
    'search' => 'php 8',
    'category' => 'it',
    'page' => 3
];
$query = http_build_query($params);
echo $query; // search=php+8&category=it&page=3
  

Php строка url (строка url в php)

Если требуется избежать кодирования пробелов как +, передайте второй аргумент '' и третий PHP_QUERY_RFC3986.

Как обрабатывать массивы в query string?

В URL массивы передаются с квадратными скобками: items[]=a&items[]=b. PHP автоматически преобразует их в настоящий массив при доступе к $_GET['items']. Для безопасности используйте фильтрацию:


// URL: ?colors[]=red&colors[]=blue&colors[]=green
$colors = filter_input(INPUT_GET, 'colors', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
if ($colors) {
    $safeColors = array_map('strip_tags', $colors);
}
  

Если нужна своя схема (например, ключи с индексами), можно воспользоваться parse_str() после ручной сборки URL.

Типичные ошибки и проблемы:

  • Использование $_GET['param'] без проверки существования ключа - приводит к выводу ошибки уровня E_WARNING.
  • Неправильное кодирование/раскодирование спецсимволов (например, пробел кодируется как + или %20). Функции urlencode() и urldecode() решают это.
  • XSS-уязвимости: вывод нефильтрованных параметров в HTML. Всегда используйте htmlspecialchars() или экранируйте.
  • Путаница с $_GET и $_REQUEST: последний объединяет GET, POST и COOKIE, что создаёт неоднозначность.
  • Использование filter_input() с неверным типом фильтра приводит к неожиданным false.

Решение всех проблем - единообразное применение фильтров, проверка isset/?? и экранирование вывода.

- Include php url (включение url через include в php)
- Engine php url (движок url в php)
- Url form php (url формы в php)

Расширенные примеры работы с query string

Ниже приведены подробные примеры, которые показывают нестандартные ситуации и комбинированные приёмы.

Пример 1. Сборка сложного запроса с многомерным массивом

Пример

$filters = [
    'price' => [
        'min' => 100,
        'max' => 500
    ],
    'brand' => ['Nike', 'Adidas'],
    'sort' => 'price_asc'
];
$query = http_build_query($filters, '', '&', PHP_QUERY_RFC3986);
echo $query;
// price%5Bmin%5D=100&price%5Bmax%5D=500&brand%5B0%5D=Nike&brand%5B1%5D=Adidas&sort=price_asc
  

Результат: правильно закодированный URL-запрос, который PHP восстановит в исходную структуру при парсинге.

Пример 2. Обработка входящего URL с несколькими источниками параметров

Пример

$currentUrl = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$query = parse_url($currentUrl, PHP_URL_QUERY);
parse_str($query, $params);

// Добавляем новый параметр
$params['utm_source'] = 'newsletter';
// Удаляем старый
unset($params['old_param']);

$newQuery = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
$newUrl = strtok($currentUrl, '?') . '?' . $newQuery;
echo 'Новый URL: ' . $newUrl;
  

Пояснение: сначала извлекаем строку запроса из текущего URL, преобразуем в массив, модифицируем и собираем обратно. Это удобно для построения канонических ссылок или редиректов.

Пример 3. Фильтрация массива параметров с помощью filter_var_array

Пример

$definitions = [
    'id' => FILTER_VALIDATE_INT,
    'name' => FILTER_SANITIZE_STRING,
    'tags' => [
        'filter' => FILTER_SANITIZE_STRING,
        'flags' => FILTER_REQUIRE_ARRAY
    ]
];
$result = filter_var_array($_GET, $definitions);
if ($result === false || in_array(false, $result, true)) {
    // ошибка валидации
    echo 'Неверные данные';
} else {
    var_dump($result);
}
  

Здесь применён массовый фильтр для нескольких ключей одновременно, включая массив tags. Это позволяет обработать все параметры одной строкой кода.

Пример 4. Работа с URL, содержащим закодированный JSON в query string

Пример

$jsonData = [
    'user' => ['id' => 123, 'role' => 'admin'],
    'action' => 'delete'
];
$query = 'data=' . urlencode(json_encode($jsonData));
echo 'Сформированный URL: /action?' . $query . "\n";

// Обработка
$raw = filter_input(INPUT_GET, 'data', FILTER_SANITIZE_STRING);
$decoded = json_decode($raw, true);
if ($decoded && isset($decoded['user']['id'])) {
    echo 'ID пользователя: ' . (int)$decoded['user']['id'];
}
  

Результат вывода:

Сформированный URL: /action?data=%7B%22user%22%3A%7B%22id%22%3A123%2C%22role%22%3A%22admin%22%7D%2C%22action%22%3A%22delete%22%7D
ID пользователя: 123

Внимание: такой подход требует строгой валидации, так как JSON может содержать опасные данные.

Пример 5. Разбор query string с повторяющимися ключами без квадратных скобок

Пример

$query = 'id=1&id=2&id=3';
parse_str($query, $result);
print_r($result);
/*
Array
(
    [id] => 3  // перезапишет последним значением
)
*/

// Чтобы получить все значения, используйте кастомный парсер:
$pairs = explode('&', $query);
$params = [];
foreach ($pairs as $pair) {
    list($key, $value) = explode('=', $pair, 2);
    $params[urldecode($key)][] = urldecode($value);
}
print_r($params);
/*
Array
(
    [id] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
)
*/
  

Пояснение: стандартный парсер PHP перезаписывает повторяющиеся ключи; для получения массива без квадратных скобок приходится парсить вручную.

Обратите внимание: во всех примерах входные данные считаются потенциально небезопасными. Всегда экранируйте вывод htmlspecialchars() и не доверяйте значениям без фильтрации.

URL-запрос (query string) в PHP - comments

En
Php url query (php)