Необходимо сформировать ссылку, которая содержит пары имя/значение в строке запроса.
Закодируйте имена и значения с помощью функции 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.