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/?? и экранирование вывода.
Расширенные примеры работы с 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() и не доверяйте значениям без фильтрации.