【发布时间】:2011-11-04 15:19:56
【问题描述】:
如何通过 $_GET 将一个或多个数组类型的变量传递到另一个页面?
我总是以?a=1&b=2&c=3 的形式传递变量值
如果通过a=[1,2,3] 呢?
我是否需要编写一个 for 循环并附加所有值?
谢谢
【问题讨论】:
如何通过 $_GET 将一个或多个数组类型的变量传递到另一个页面?
我总是以?a=1&b=2&c=3 的形式传递变量值
如果通过a=[1,2,3] 呢?
我是否需要编写一个 for 循环并附加所有值?
谢谢
【问题讨论】:
您可以使用[] 语法通过_GET 传递数组:
?a[]=1&a[]=2&a[]=3
PHP 理解这种语法,所以$_GET['a'] 将等于array(1, 2, 3)。
您还可以指定键:
?a[42]=1&a[foo]=2&a[bar]=3
多维数组也可以:
?a[42][b][c]=1&a[foo]=2
http_build_query() 自动执行此操作:
http_build_query(array('a' => array(1, 2, 3))) // "a[]=1&a[]=2&a[]=3"
http_build_query(array(
'a' => array(
'foo' => 'bar',
'bar' => array(1, 2, 3),
)
)); // "a[foo]=bar&a[bar][]=1&a[bar][]=2&a[bar][]=3"
另一种方法是传递 json 编码的数组:
?a=[1,2,3]
你可以用json_decode解析a:
$a = json_decode($_GET['a']); // array(1, 2, 3)
然后用 json_encode 再次编码:
json_encode(array(1, 2, 3)); // "[1,2,3]"
永远不要将serialize() 用于此目的。 Serialize 允许序列化对象,并且有一些方法可以让它们执行代码。所以你永远不应该反序列化不受信任的字符串。
【讨论】:
urlencode() 不是对抗 xss 的方法。 htmlspecialchars() 是。但是任何人都应该已经htmlspecialchars() 他输出的所有内容。
href="")
urlencode() 并不是要转义 html,它的目标是转义 url 组件;) 所以你只需用 urlencode() 转义参数名称和值,然后用 htmlspecialchars() 转义整个 url在将其嵌入 HTML 文档之前。
<、>、&、"、' 进行编码,这样您就安全了……
您可以将关联数组传递给http_build_query(),并将结果字符串作为查询字符串附加到URL。数组会被 PHP 自动解析,所以接收页面上的$_GET 会包含一个数组。
示例
$query_str = http_build_query(array(
'a' => array(1, 2, 3)
));
【讨论】:
$city_names = array(
'delhi',
'mumbai',
'kolkata',
'chennai'
);
$city_query = http_build_query(array('city' => $city_names));
这会给你:
city[0]=delhi&city[1]=mumbai&city[2]=kolkata&city[3]=chennai
如果您还想对括号进行编码,请使用以下代码:
$city_query = urlencode(http_build_query(array('city' => $city_names)));
输出:
city%255B0%255D%3Ddelhi%26city%255B1%255D%3Dmumbai .....
【讨论】:
只需像这样重复您的 $_GET 变量:name=john&name=lea
这会给你一个array。
我曾经相信它会被覆盖!
【讨论】:
name 部分上包含方括号才能获取数组。至少,在 PHP 5.3+ 上会发生这种情况。