Параметры URL в PHP: как обрабатывать данные форм
Основы работы с URL формами в PHP
При передаче данных через HTTP-формы методом GET или при формировании ссылок с параметрами возникает необходимость корректно создавать и разбирать URL. PHP предоставляет встроенные функции для этих задач. Рассмотрим наиболее эффективное решение и альтернативные подходы.
Эффективное создание и разбор строк запроса с помощью http_build_query и parse_str
Функция http_build_query преобразует массив в URL-кодированную строку запроса. Обратная операция выполняется функцией parse_str.
$params = ['name' => 'Иван', 'age' => 30];
$query = http_build_query($params);
// $query = "name=%D0%98%D0%B2%D0%B0%D0%BD&age=30"Php создание ссылки (создание ссылки в php)
Для разбора строки запроса в массив:
$query = "name=Иван&age=30";
parse_str($query, $output);
print_r($output);
/* Результат:
Array
(
[name] => Иван
[age] => 30
)*/Php текущая url (текущая url в php)
Типичная ошибка: забыть указать второй параметр в parse_str, что приведет к установке переменных в глобальную область. Всегда используйте второй параметр для помещения результатов в массив.
Как вручную собрать строку запроса с кодированием?
Иногда требуется сформировать URL без использования http_build_query, например, для совместимости со старыми версиями PHP или при необходимости тонкого контроля.
$params = ['name' => 'Иван', 'age' => 30];
$parts = [];
foreach ($params as $key => $value) {
$parts[] = urlencode($key) . '=' . urlencode($value);
}
$query = implode('&', $parts);Mobile php url (мобильный url в php)
Проблема: не учитываются массивы (например, name[]). Для массивов потребуется отдельная обработка.
Как извлечь параметры из полного URL с помощью parse_url?
Функция parse_url разбивает URL на компоненты. Для получения строки запроса используется константа PHP_URL_QUERY.
$url = "https://example.com/page?name=Иван&age=30";
$queryString = parse_url($url, PHP_URL_QUERY);
parse_str($queryString, $params);
print_r($params);Php open url (открытие url в php)
Ошибка: если URL содержит фрагмент (#), parse_url может некорректно обработать. Рекомендуется сначала удалить фрагмент или использовать фильтрацию.
Как передать массив через URL в форме?
HTML форма с полями name[] создаст в PHP массив $_GET['name']. Для явного формирования такого URL используется стандартная нотация.
// Формирование
$params = ['name' => ['Иван', 'Петр']];
$query = http_build_query($params);
// Результат: name%5B0%5D=%D0%98%D0%B2%D0%B0%D0%BD&name%5B1%5D=%D0%9F%D0%B5%D1%82%D1%80
// В браузере это будет name[]=Иван&name[]=Петр после декодированияJs php url (javascript и php url)
Проблема: разные браузеры могут по-разному кодировать квадратные скобки. PHP автоматически обрабатывает их при получении.
Как безопасно получить параметры с помощью filter_input?
Для получения параметров с фильтрацией (например, проверка целого числа) используется filter_input.
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
if ($age === false) {
// обработка ошибки
}Ошибка: filter_input возвращает null если параметр отсутствует, false если не прошёл валидацию. Важно различать.
Расширенные примеры работы с URL формами
Пример 1: Создание URL с несколькими массивами и вложенными ключами.
$data = [
'user' => [
'name' => 'Иван',
'hobbies' => ['футбол', 'книги']
],
'page' => 1
];
$query = http_build_query($data, '', '&', PHP_QUERY_RFC3986);
echo $query;
// user%5Bname%5D=%D0%98%D0%B2%D0%B0%D0%BD&user%5Bhobbies%5D%5B0%5D=%D1%84%D1%83%D1%82%D0%B1%D0%BE%D0%BB&user%5Bhobbies%5D%5B1%5D=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8&page=1user%5Bname%5D=%D0%98%D0%B2%D0%B0%D0%BD&user%5Bhobbies%5D%5B0%5D=%D1%84%D1%83%D1%82%D0%B1%D0%BE%D0%BB&user%5Bhobbies%5D%5B1%5D=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8&page=1
Пример 2: Использование http_build_query с числовым префиксом и пользовательским разделителем.
$params = ['name' => 'Иван', 'age' => 30];
$query = http_build_query($params, 'param_', '&');
echo $query;
// param_name=%D0%98%D0%B2%D0%B0%D0%BD¶m_age=30param_name=%D0%98%D0%B2%D0%B0%D0%BD¶m_age=30
Пример 3: Декодирование URL с использованием rawurldecode и обработка ошибок.
$encoded = "name=%D0%98%D0%B2%D0%B0%D0%BD&age=30";
$decoded = rawurldecode($encoded);
// Внимание: rawurldecode не обрабатывает + как пробел, используйте urldecode если нужно
echo $decoded;
// name=Иван&age=30name=Иван&age=30
Пример 4: Получение параметров из URL с учетом фрагмента (якоря).
$url = "https://example.com/page?name=Иван#section";
$parsed = parse_url($url);
$query = $parsed['query'] ?? '';
$fragment = $parsed['fragment'] ?? '';
parse_str($query, $params);
echo "Параметры: " . print_r($params, true) . ", фрагмент: $fragment";Параметры: Array ( [name] => Иван ), фрагмент: section
Пример 5: Использование filter_input_array для массовой фильтрации.
$filters = [
'name' => FILTER_SANITIZE_STRING,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]],
'email' => FILTER_VALIDATE_EMAIL
];
$inputs = filter_input_array(INPUT_GET, $filters);
print_r($inputs);Array ( [name] => Иван [age] => 30 [email] => false )