2009-09-07 45 views
0

我正在寻找一个在URL中传递的参数列表。URL中的多个变量为1

$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传递的内容在URL字符串中获取var?

在此先感谢。

+0

您没有说明这个数据的语义。让远程匿名用户直接操纵$ url可能存在严重的安全问题。 – geocar 2009-09-07 15:54:43

回答

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编码的。

编辑

刚刚看了你的,它应该是只有一个变量的其他要求。所以不要这个答案。 如果你的问题是正确的编码,但你可能想再试一次。

希望有所帮助。

+0

你给了我一个想法: 回声$ NEWURL = http_build_query($网址 “”, “|”); 它可以给我: 键1 = 1 | key2 = 2 | key3 = 3 | key4 = 4 | key5 = 5 | key6 = 6 | key7 = 7 – Lizard 2009-09-07 15:06:02

+0

这不是我说的5分钟前的内容吗::| – Greg 2009-09-07 15:07:33

+0

@greg对不起!没有看到! – Lizard 2009-09-07 15:25:39

1

构造URL时,投入单$_GET变量(例如data=sfsdfasdf98sdfasdf)所得的序列化的值,然后将unserialize可变$_GET["data"]你可以serialize它们作为键 - 值对。您需要使用urlencode以确保生成的序列化值是URL安全的。请务必留意最大网址长度 - 2083 characters in IE

但是,除非你真的不能在URL中使用键值对(根据你的问题),key1=foo&key2=bar...肯定是要走的路。

+0

您也可以使用bzcompress()来节省空间。另请注意,使用serialize()可能存在安全考虑,这取决于您使用unserialize()数据的方式。 – geocar 2009-09-07 15:56:40

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,但是是最多的工作。

+0

我想到了,但字符串变得很长: serialized = :7:{s:4:“key1”; i:1; s:4:“key2”; i:2; s:4: “KEY3”; I:3; S:4: “KEY4”; I:4; S:4: “KEY5”; I:5; S:4: “键6”; I:6; S:4:“KEY7 “; i:7;} 使用url_enode: a%3A7%3A%7Bs%3A4%3A%22key1%22%3Bi%3A1%3Bs%3A4%3A%22key2%22%3Bi%3A2%3Bs%3A4% 3A%22key3%22%3Bi%3A3%3BS%3A4%3A%22key4%22%3Bi%3A4%3BS%3A4%3A%22key5%22%3Bi%3A5%3BS%3A4%3A%22key6%22%3Bi% 3A6%3Bs%3A4%3A%22key7%22%3Bi%3A7%3B%7D 长度是否会成为问题? – Lizard 2009-09-07 14:47:38

+1

〜200个字符不是真正的问题......只是非常难看。尝试JSON而不是 – Greg 2009-09-07 14:49:18

+0

你有大约2048个字符,但理论上应该没有限制:http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-an-url – robjmills 2009-09-07 14:49:35

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']); 
+0

对不起,我需要的键名:( – Lizard 2009-09-07 14:48:30

+0

好了,更新的答案 – soulmerge 2009-09-07 14:52:22

0

您是否可以通过将数据保存为HTML cookie来解决您的问题?这样你就不必修改URL了。

如果您事先知道这些值,则可以在向用户发送包含目标链接的页面时从服务器端进行设置。

如果直到用户填写表单时才会知道值,则仍然可以使用JavascriptL完成。当用户单击表单提交时,可以通过多次调用JavaScript来设置多个Cookie,如: document.cookie = “键1 =试验; expires = Mon,2009年9月7日23:47:11 UTC; path = /'

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

+0

仍然存在:即使您解决实际放置数据的方式,如何编码数据。 – geocar 2009-09-07 15:57:59

2

使用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); 
}