Формирование строки запроса GET

Задача
Необходимо сформировать ссылку, которая содержит пары имя/значение в строке запроса.

Решение
Закодируйте имена и значения с помощью функции urlencode(), а строку запроса создайте посредством функции join():

$vars = array('name' => 'Oscar the Grouch',
'color' => 'green',
'favorite_punctuation' => '#');
$safe_vars = array();
foreach ($vars as $name => $value) {
$safe_vars[] = urlencode($name).'='.urlencode($value);
}
$url = '/muppet/select.php?' . join('&',$safe_vars);
$vars = array('name' => 'Oscar the Grouch',
'color' => 'green',
'favorite_punctuation' => '#');
$safe_vars = array();
foreach ($vars as $name => $value) {
$safe_vars[] = urlencode($name).'='.urlencode($value);
}
$url = '/muppet/select.php?' . join('&',$safe_vars);

Обсуждение
URL, сформированный в данном решении, выглядит следующим образом:

/muppet/select.php?name=Oscar+the+Grouch&color=green&favorite_punctuation=%23

Строка запроса содержит пробелы, закодированные символом +. Специальные символы, такие как #, записаны в шестнадцатеричной кодировке, например %23, поскольку ASCII-значение символа # равно 35, что эквивалентно 23 в шестнадцатеричном коде.

Несмотря на то что функция urlencode() предотвращает появление любых специальных символов в именах или значениях переменных, получаемых после разбора сконструированного URL, можно столкнуться с проблемами, если имена переменных начинаются с названий примитивов HTML.


Рассмотрим следующий неполный URL, предназна-
ченный для получения информации о стереосистеме:

/stereo.php?speakers=12&cdplayer=52&=10

Элементом HTML, отображающим амперсанд (&), является & поэтому броузер может интерпретировать этот URL как:

/stereo.php?speakers=12&cdplayer=52&=10

Есть три способа избежать искажения URL, которое могут вызвать внедренные элементы. Первый заключается в том, чтобы выбирать имена переменных, которые нельзя спутать с примитивами, например, _amp вместо amp. А второй – в преобразовании символов с эквива-
лентами примитивов HTML в эти элементы перед выводом URL. Последнее делается с помощью функции htmlentities():

$url = '/muppet/select.php?' . htmlentities(join('&',$safe_vars));

В результате URL будет выглядеть так:

/muppet/select.php?name=Oscar+the+Grouch&color=green&favorite_punctuation=%23

Третий способ состоит в том, чтобы заменить значение разделителя аргументов & на ; путем установки параметра конфигурации arg_separator.input в ;. Затем надо объединить пары имя-значение с символом ; для получения строки запроса: /muppet/select.php?name=Oscar+the+Grouch;color=green;favorite_punctuation=%23

Трудности могут возникнуть с любым методом GET в URL, в котором нельзя явным образом указывать точку с запятой, например в форме с методом GET, поскольку пользовательский броузер воспринимает символ & в качестве аргумента-разделителя.

Многие броузеры не поддерживают использование символа ; в качестве аргумента-разделителя, поэтому проще всего избежать проблем с элементами в URL, выбирая имена переменных, которые не совпадают с именами элементов.


Если вы не можете полностью управлять именами переменных, то защитите URL от декодирования элементов с помощью функции htmlentities().

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Аутентификация, основанная на cookies
Буферизация вывода в броузер
Взаимодействие в рамках Apache
Идентификация различных броузеров
Настройка обработки ошибок

Вернуться в раздел: PHP / 8. Основы Web