【问题标题】:How to pass an array via $_GET in php?如何在 php 中通过 $_GET 传递数组?
【发布时间】:2011-11-04 15:19:56
【问题描述】:

如何通过 $_GET 将一个或多个数组类型的变量传递到另一个页面?

我总是以?a=1&b=2&c=3 的形式传递变量值

如果通过a=[1,2,3] 呢?

我是否需要编写一个 for 循环并附加所有值?

谢谢

【问题讨论】:

标签: php arrays get


【解决方案1】:

您可以使用[] 语法通过_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 允许序列化对象,并且有一些方法可以让它们执行代码。所以你永远不应该反序列化不受信任的字符串。

【讨论】:

  • +1 表示 json。只要确保你对你的 json 数组进行 urlencode 来对抗 xss
  • urlencode() 不是对抗 xss 的方法。 htmlspecialchars() 是。但是任何人都应该已经htmlspecialchars() 他输出的所有内容。
  • @arnoud:在属性中使用 urlencode 是安全的。当传递一个 url 时,你希望它被编码为 url,而不是标记(想想href=""
  • urlencode() 并不是要转义 html,它的目标是转义 url 组件;) 所以你只需用 urlencode() 转义参数名称和值,然后用 htmlspecialchars() 转义整个 url在将其嵌入 HTML 文档之前。
  • 而 json_encoded 数组是什么?它是一个 url 组件! urlencode 至少对<>&"' 进行编码,这样您就安全了……
【解决方案2】:

您可以将关联数组传递给http_build_query(),并将结果字符串作为查询字符串附加到URL。数组会被 PHP 自动解析,所以接收页面上的$_GET 会包含一个数组。

示例

$query_str = http_build_query(array(
    'a' => array(1, 2, 3)
));

【讨论】:

    【解决方案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 .....
    

    参考:http_build_queryurlencode

    【讨论】:

    • 简短而有帮助。 +1
    【解决方案4】:

    只需像这样重复您的 $_GET 变量:name=john&name=lea

    这会给你一个array

    我曾经相信它会被覆盖!

    【讨论】:

    • 这是不正确的。重复参数覆盖。您必须在每个 name 部分上包含方括号才能获取数组。至少,在 PHP 5.3+ 上会发生这种情况。
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2011-05-24
    相关资源
    最近更新 更多