具有相同标识符的多个HTTP GET参数

时间:2010-10-20 16:38:13

标签: php parameters http-get

假设我收到的请求如下:

http://www.example.com/index.php?id=123&version=3&id=234&version=4

是否可以在我的PHP代码中以简单的方式提取这些内容?我意识到我可以使用window.location.href使用javascript获取整个查询字符串并手动处理它但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ ID对,但我可以假设查询格式正确,并且没有义务处理无效字符串。

5 个答案:

答案 0 :(得分:24)

如果您可以更改字段名称以包含[],那么PHP将创建一个包含所有匹配值的数组:

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4

如果您无法更改字段名称,那么正如您所说,您必须自己解析查询字符串。

答案 1 :(得分:7)

根据this comment from the PHP manual,PHP的查询字符串解析器将删除重复的参数...所以我不认为PHP非常适合您想要做的事情(除了它具有相同的容量) javascript以获取原始查询字符串,您可以使用它来执行任何操作)

答案 2 :(得分:1)

假设您对请求有一些控制权,请将名称加上[]后缀,PHP将生成数组,而不是丢弃除了一个数组。

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4

由于它们是,您可能希望修复它们在使用索引时出现的顺序。

http://www.example.com/index.php?id[0]=123&version[0]=3&id[1]=234&version[1]=4

答案 3 :(得分:1)

只需提取$ _GET的键和值,使用以下函数:

print_array('$_GET...',$_GET);

...功能代码为:

function print_array($title, $arr) {
    echo '<table width="100%" style="padding:10;">';
    echo '<tr><td width="30%" style="text-align:right; background-color:bisque;">key of </td><td style="background-color:bisque;">'.$title.'</td></tr>';
    foreach($arr as $key => $value) {
        echo '<tr>';
            echo '<td style="text-align:right; color:grey;">';
                echo $key;
            echo '</td>';
            echo '<td>';
                echo $value;
            echo '</td>';
        echo '</tr>';
    }
    echo '</table>';
}

答案 4 :(得分:0)

不像上面提到的方法那样圆润或可靠,但我使用它来删除网址中[]的必要性而不用担心重写。

$aQuery = explode("&", $_SERVER['QUERY_STRING']);
$aQueryOutput = array();
foreach ($aQuery as $param) {
    if(!empty($param)){
        $aTemp = explode('=', $param, 2);
        if(isset($aTemp[1]) && $aTemp[1] !== ""){
            list($name, $value) = explode('=', $param, 2);
            $aQueryOutput[ strtolower(urldecode($name)) ][] = urldecode(preg_replace('/[^a-z 0-9\'+-]/i', "", $value));
        }
    }
}