Я ищу список аргументов, передаваемых через URL-адрес.
$url['key1']=1; $url['key2']=2; $url['key3']=3; $url['key4']=4; $url['key5']=5; $url['key6']=6; $url['key7']=7;
Обратите внимание, что я пытаюсь передать это URL в 1 переменной GET. Я знаю, что это было бы лучше сделать: key1 = 1 & key2 = 2 & key3 = 3 … и т. Д., Но по причинам, которые слишком сложны, чтобы попытаться объяснить, что они не могут быть в этом формате.
Любые предложения, как я могу преобразовать этот массив в нечто, которое можно передать как 1 получить var в строке URL?
Заранее спасибо.
Попробуйте http_build_query
:
$url['key1']=1; $url['key2']=2; $url['key3']=3; $url['key4']=4; $url['key5']=5; $url['key6']=6; $url['key7']=7; echo http_build_query($url); //echos key1=1&key2=2&key3=3&key...
То, что он делает, – это преобразование массива в строку запроса с использованием ключей и автоматическое выполнение кодировки url.
EDIT :
Просто прочитайте свое дополнительное требование, чтобы оно было всего лишь одной переменной. Так что не думайте об этом ответе. Если ваша проблема была правильной кодировкой, хотя вы можете попробовать эту другую попытку.
Надеюсь, это поможет.
Вы можете использовать json_encode()
или serialize()
$myUrl = 'http://www.example.com/?myKey=' . urlencode(json_encode($url));
или
$myUrl = 'http://www.example.com/?myKey=' . urlencode(serialize($url));
Использование json_encode
обычно дает вам более короткую строку, но очень старая версия PHP может не иметь функцию json_decode
доступную для ее декодирования.
Конечным способом было бы создание собственной пользовательской кодировки … это могло бы быть так же простое разделение по каналам: key1 | 1 | key2 | 2 | key3 | 3
Это даст вам лучший вариант для короткого URL-адреса, но это больше всего работает.
Рекомендация использовать serialize()
в порядке. Если пространство является проблемой, используйте комбинацию bzcompress()
и serialize()
.
Однако есть соображения безопасности, которые не были затронуты, и что конечный пользователь (который может видеть и редактировать этот URL-адрес) может манипулировать данными внутри него. Вы можете подумать, что это сложно, но большинство вредоносных червей PHP в дикой природе делают это в той или иной степени.
Если позволить пользователю напрямую манипулировать любыми ключами или значениями (или заменять их целым числом или объектом или чем-либо еще), тогда вы должны защитить свой сценарий (и ваших пользователей) от этой атаки.
Простое решение – просто использовать общий секрет. Это может быть что угодно; просто пока он уникален и по-настоящему секретен (возможно, вы должны произвольно генерировать его во время установки). Допустим, у вас в вашем файле конфигурации что-то вроде этого:
define('SECRET', 'unoqetbioqtnioqrntbioqt');
Затем вы можете цифровую подпись сериализованных данных, созданных с помощью: $s=serialize($m)
с использованием $k=sha1($s.SECRET)
и сделать значение url $k.$s
Затем, прежде чем вы выполните unserialize()
выполните следующие действия:
$v=substr($input,0,40); $s=substr($input,40); if ($v != sha1($s.SECRET)) { die("invalid input"); } $m=unserialize($s);
Таким образом, вы знаете, что $m
совпадает с исходным значением, которое вы сериализуете.
Если хотите, вы можете использовать следующие замены:
define('SECRET','buh9tnb1094tib014'); // make sure you pick something else function secureserialize($o) { $s=serialize($o); return sha1($s.SECRET).$s; } function secureunserialize($i) { $v=substr($i,0,40);$s=substr($i,40); if ($v!=sha1($s.SECRET)){die("invalid input");} return unserialize($s); }
Вы можете serialize
их как пары «ключ-значение» при построении URL-адреса, поместив результирующее сериализованное значение в одну переменную $_GET
(например, data=sfsdfasdf98sdfasdf
), а затем data=sfsdfasdf98sdfasdf
переменную $_GET["data"]
. Вам нужно будет использовать urlencode
чтобы убедиться, что полученные сериализованные значения являются безопасными для URL. Убедитесь, что вы отслеживаете максимальную длину URL-адреса – 2083 символа в IE .
Однако, если вы действительно не можете использовать пары ключ-значение в URL-адресах (по вашему вопросу), key1=foo&key2=bar...
, безусловно, путь.
Если вы не возражаете отказаться от имен ключей, вы можете использовать
http://example.com?url[]=1&url[]=2&url[]=3
EDIT Сохранение имен ключей:
http://example.com?values[]=1&values[]=2&values[]=3&keys[]=1&keys[]=2&keys[]=3
Затем в вашем скрипте PHP:
$url = array_combine($_GET['keys'], $_GET['values']);
Не могли бы вы решить свою проблему, сохранив данные в виде cookie HTML? Таким образом, вам не нужно изменять URL-адрес вообще.
Если вы знаете значения заранее, вы можете установить их со стороны сервера, когда вы отправляете пользователю страницу со своей целевой ссылкой на нее.
Если вы не будете знать значения до тех пор, пока пользователь не заполнит форму, он все равно может быть выполнен с использованием JavascriptL. Когда пользователь нажимает на форму отправки, вы можете установить несколько файлов cookie, выполнив несколько вызовов javascript, таких как document.cookie = 'key1 = test; expires = Пн, 7 сен 2009 23:47:11 UTC; Путь = /»
Модель безопасности может дать вам некоторые проблемы, если вы пытаетесь передать эти данные из одного домена в другой.