2010-10-20 3 views
9

Допустим, я получаю запросы, такие как:несколько параметров HTTP GET с тем же идентификатором

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

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

+0

Можно ли изменить формат строки запроса? такие как 'index.php? records [id] [] = 123 & records [version] [] = 3 & records [id] [] = 234 & records [version] [] = 4', чтобы вы могли получить их с помощью' $ _GET ["записей "] [" id "] [0] # = 123' и' $ _GET ["records"] ["version"] [0] # = 3' – PeterWong

+0

Пока запрос выполняется по программному обеспечению нашей компании, клиентское приложение имеет уже давно поставлен и установлен на тысячах компьютеров. Следующее обновление этого программного обеспечения может содержать изменения в синтаксисе, но поскольку эта функциональность связана с автоматическими обновлениями программного обеспечения, ему необходимо работать с текущим состоянием запросов. – MatsT

+0

Это возможно, см. Это сообщение: http://stackoverflow.com/questions/353379/how-to-get-multiple-parameters-with-same-name-from-a-url-in-php –

ответ

7

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

+10

+1 Это кажется довольно глупым на стороне PHP, я думаю, что любая другая платформа поддерживает многозначные параметры http без проблем. – leonbloy

+0

В этом замечании есть пример кода для обходной функции, спасибо. – MatsT

+1

PHP действительно поддерживает это. Многозначные переменные querystring попадают в массив и к ним можно получить доступ. Обходной путь не требуется. Не проблема PHP. – mmundiff

22

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

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

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

+1

Не должен ли первый 'id {}' изменен на 'id []'? –

+0

Yup. Исправлено, спасибо. –

+0

Может ли кто-нибудь указать на место в http://php.net/manual/en/index.php, где эта функция документирована? –

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 
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>'; 
} 
0

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