URL中的多个变量为1

时间:2009-09-07 14:41:14

标签: php arrays url query-string

我希望在一个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传递的内容的任何建议吗?

提前致谢。

6 个答案:

答案 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)

尝试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编码。

修改

请阅读您的附加要求,即它应该只是一个变量。所以永远不要回答这个问题。 如果你的问题是正确的编码,你可能想再试一次。

希望有所帮助。

答案 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;路径= /'

如果您尝试将此数据从一个域传递到另一个域,安全模型可能会给您带来一些麻烦。