Несколько параметров HTTP GET с одним и тем же идентификатором - PullRequest
11 голосов
/ 20 октября 2010

Допустим, я получаю запросы, такие как:

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

Возможно ли извлечь их простым способом из моего php-кода?Я понимаю, что могу получить всю строку запроса с помощью javascript с помощью window.location.href и обработать ее вручную, но я ищу что-то более элегантное.Запросы могут содержать любое количество пар версия / идентификатор, но я могу предположить, что запрос правильно сформирован и не обязан обрабатывать недопустимые строки.

Ответы [ 5 ]

24 голосов
/ 20 октября 2010

Если вы можете изменить имя поля на [], тогда PHP создаст массив, содержащий все совпадающие значения:

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

Если у вас нет возможности изменить имена полей, то, как вы говорите, вам придется анализировать строку запроса самостоятельно.

7 голосов
/ 20 октября 2010

Согласно этому комментарию из руководства по PHP , синтаксический анализатор строк запроса PHP будет отбрасывать дублирующиеся параметры ... поэтому я не думаю, что PHP хорошо подходит для того, что вы хотите сделать (за исключением что он имеет такую ​​же емкость, что и javascript для получения необработанной строки запроса, с которой вы можете делать все, что захотите)

1 голос
/ 28 июля 2014

Просто извлеките ключи и значения $ _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>';
}
1 голос
/ 20 октября 2010

Предполагая, что у вас есть некоторый контроль над запросом, добавьте к имени [] суффикс, и 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
0 голосов
/ 16 декабря 2016

Не такой округлый или надежный, как методы, упомянутые выше, но я использую это, чтобы устранить необходимость в [] в URL, не беспокоясь о переписывании.

$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));
        }
    }
}
...