Разработчику. Сборник рецептов PHP
Задавайте вопросы

Формирование строки запроса 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);

Обсуждение

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

Есть три способа избежать искажения 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().

См. также

Документацию по функции urlencode() на http://www.php.net/urlencodeи по функции htmlentities() на http://www.php.net/htmlentities.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ