Несколько параметров HTTP GET с одним и тем же идентификатором

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

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

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


person MatsT    schedule 20.10.2010    source источник
comment
Можно ли изменить формат строки запроса? например index.php?records[id][]=123&records[version][]=3&records[id][]=234&records[version][]=4, чтобы вы могли получить их по $_GET["records"]["id"][0] #= 123 и $_GET["records"]["version"][0] #= 3   -  person PeterWong    schedule 20.10.2010
comment
Хотя строка запроса создается программным обеспечением нашей компании, клиентское приложение уже давно доставлено и установлено на тысячах компьютеров. Следующее обновление этого программного обеспечения может содержать изменения синтаксиса, но поскольку эта функция связана с автоматическими обновлениями программного обеспечения, она должна работать с текущим состоянием строк запроса.   -  person MatsT    schedule 20.10.2010
comment
Это возможно, см. Этот пост: stackoverflow.com/questions/353379/   -  person Kevin Florida    schedule 04.05.2011


Ответы (5)


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

person Brian Driscoll    schedule 20.10.2010
comment
+1 Это кажется довольно глупым со стороны PHP, я думаю, что любая другая платформа без проблем поддерживает многозначные параметры http. - person leonbloy; 20.10.2010
comment
В этом же комментарии есть пример кода для обходной функции, спасибо. - person MatsT; 20.10.2010
comment
PHP поддерживает это. Многозначные переменные строки запроса помещаются в массив, и к ним можно получить доступ оттуда. Никакого обходного пути не требуется. Это не проблема PHP. - person mmundiff; 11.04.2015
comment
@mmundiff Вы можете быть прямо сейчас ... моему первоначальному ответу почти пять лет. - person Brian Driscoll; 12.04.2015

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

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

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

person Jacob Mattison    schedule 20.10.2010
comment
Разве первый id{} не должен измениться на id[]? - person Jin Kwon; 23.11.2012
comment
Может ли кто-нибудь указать место на php.net/manual/en/index.php где эта функция задокументирована? - person Ivan Krechetov; 04.04.2016
comment
Здесь есть документация: php.net/manual/en/faq. html.php # faq.html.arrays Эта функция также обсуждается в примечании к документации $ _POST, получившем наибольшее количество голосов: php.net/manual/en/reserved.variables.post.php - person Jacob Mattison; 05.04.2016

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

Просто извлеките ключи и значения $ _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>';
}
person Vitor Marques    schedule 28.07.2014

Не такой округлый и надежный, как упомянутые выше методы, но я использую его, чтобы убрать необходимость [] в 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));
        }
    }
}
person atoms    schedule 16.12.2016