我希望在一个URL中传递一个参数列表。
$url['key1']=1;
$url['key2']=2;
$url['key3']=3;
$url['key4']=4;
$url['key5']=5;
$url['key6']=6;
$url['key7']=7;
请注意我试图在1 GET变量的URL中传递它。我知道这样做会更好吗?key1 = 1& key2 = 2& key3 = 3 ...等等,但由于原因太复杂而无法尝试解释它们不能采用这种格式。
有关如何将此数组转换为可在URL字符串中作为1 get var传递的内容的任何建议吗?
提前致谢。
答案 0 :(得分:4)
您可以使用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的最佳选择,但是工作量最大。
答案 1 :(得分:3)
$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编码。
修改强>:
请阅读您的附加要求,即它应该只是一个变量。所以永远不要回答这个问题。 如果你的问题是正确的编码,你可能想再试一次。
希望有所帮助。
答案 2 :(得分:2)
使用serialize()
的建议很好。如果空间有问题,请使用bzcompress()
和serialize()
的组合。
但是,有一个安全性考虑到尚未提出,并且最终用户(可以查看和编辑此URL)可以操纵其中的数据。您可能认为这很困难,但是野外的大多数攻击PHP的蠕虫都会在某种程度上做到这一点。
如果让用户直接操作任何的键或值(或用整数,对象或其他任何东西替换它),那么你应该保护你的脚本(和你的用户)来自这次袭击。
一个简单的解决方案是简单地使用共享密钥。它可以是任何东西;只要它是独一无二且真正的秘密(也许你应该在安装时随机生成它)。假设您的配置文件中包含以下内容:
define('SECRET', 'unoqetbioqtnioqrntbioqt');
然后,您可以使用$s=serialize($m)
使用$k=sha1($s.SECRET)
对使用$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);
}
与您序列化的原始值相同。
如果您愿意,可以使用以下插入式替换:
{{1}}
答案 3 :(得分:1)
在构建网址时,您可以serialize
将它们作为键值对,将结果序列化值放在单个$_GET
变量中(例如data=sfsdfasdf98sdfasdf
),然后unserialize
$_GET["data"]
变量。您需要使用urlencode
来确保生成的序列化值是URL安全的。请务必注意最长网址长度 - 2083 characters in IE。
但是,除非您确实无法在网址中使用键值对(根据您的问题),key1=foo&key2=bar...
绝对是您的选择。
答案 4 :(得分:0)
如果您不介意删除密钥名称,可以使用
http://example.com?url[]=1&url[]=2&url[]=3
编辑保留密钥名称:
http://example.com?values[]=1&values[]=2&values[]=3&keys[]=1&keys[]=2&keys[]=3
然后在你的PHP脚本中:
$url = array_combine($_GET['keys'], $_GET['values']);
答案 5 :(得分:0)
您可以将数据保存为HTML Cookie来解决问题吗?这样您就不必修改URL了。
如果您事先知道这些值,则可以在向用户发送包含目标链接的页面时从服务器端设置这些值。
如果在用户填写表单之前您不知道这些值,仍然可以使用JavascriptL完成。当用户点击表单提交时,您可以通过多个javascript调用设置多个Cookie: document.cookie ='key1 = test; expires =星期一,2009年9月7日23:47:11 UTC;路径= /'
如果您尝试将此数据从一个域传递到另一个域,安全模型可能会给您带来一些麻烦。