2010-10-20 6 views
9

Sagen wir, ich bin immer Anfragen wie:Mehrere HTTP-GET-Parameter mit der gleichen Kennung

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

Ist es möglich, diese auf einfache Art und Weise in meinem PHP-Code zu extrahieren? Ich weiß, dass ich die gesamte querystring mit Javascript mit window.location.href bekommen konnte und handle es manuell, aber ich suche nach etwas eleganterem. Die Anfragen können eine beliebige Anzahl von Versions-/ID-Paaren enthalten, aber ich kann annehmen, dass die Anfrage wohlgeformt ist und nicht verpflichtet ist, ungültige Zeichenfolgen zu behandeln.

+0

Ist es möglich, das Format der Abfragezeichenfolge zu ändern? wie zum Beispiel 'index.php? records [id] [] = 123 & records [version] [] = 3 & records [id] [] = 234 & records [version] [] = 4', damit man sie mit' $ _GET ["records" abruft "] [" id "] [0] # = 123' und' $ _GET ["records"] ["version"] [0] # = 3' – PeterWong

+0

Während der Querystring von der Software unseres Unternehmens erstellt wird, hat die Client-Anwendung seit langem geliefert und auf Tausenden von Computern installiert. Das nächste Update dieser Software kann Änderungen an der Syntax enthalten, aber da diese Funktionalität mit den automatischen Updates der Software zusammenhängt, muss sie mit dem aktuellen Status der Querystrings arbeiten. – MatsT

+0

Dies ist möglich, siehe diesen Beitrag: http://stackoverflow.com/questions/353379/how-to-get-multiple-parameters-with-same-name-from-a-url-in-php –

Antwort

7

Nach this comment from the PHP manual, PHPs Query String Parser wird doppelte Params fallen lassen ... so glaube ich nicht, dass PHP ist eine gute Lösung für das, was Sie tun möchten (außer dass es die gleiche Kapazität wie Javascript zu bekommen der rohe Abfrage-String, mit dem Sie, was Sie wollen)

+10

+1 Dies scheint auf der PHP-Seite ziemlich dumm zu sein, ich denke, dass jede andere Plattform mehrwertige HTTP-Parameter ohne Probleme unterstützt. – leonbloy

+0

Es gibt ein Codebeispiel für eine Problemumgehungsfunktion in diesem sehr Kommentar, danke. – MatsT

+1

PHP unterstützt dies. Mehrwertige Querystring-Variablen gehen in ein Array und können von dort aus aufgerufen werden. Keine Problemumgehung erforderlich. Kein PHP-Problem. – mmundiff

22

tun Wenn Sie die Feldnamen [] ändern zu schließen, dann wird PHP ein Array erstellen, die alle der Anpassungswerte enthält:

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

Wenn Sie haben nicht die Möglichkeit, die Feldnamen zu ändern, dann müssen Sie, wie Sie sagen, die Querystring selbst analysieren f.

+1

Sollte nicht die erste 'id {}' in 'id []' geändert werden? –

+0

Yup. Fest, danke. –

+0

Kann jemand auf einen Ort auf http://php.net/manual/en/index.php verweisen, wo dieses Feature dokumentiert ist? –

1

Angenommen, Sie haben die Kontrolle über die Anfrage, Suffix den Namen mit [] und PHP wird Arrays generieren statt alle bis auf eine.

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

Da sie Paare Sie werden wahrscheinlich die Reihenfolge erscheinen sie in Verwendung von Indizes korrigieren möchten.

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

extrahieren Sie einfach die Schlüssel und Werte von $ _GET, verwenden Sie die Funktion als:

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

... und der Funktionscode wird:

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

nicht als rundliche oder Zuverlässig wie die oben genannten Methoden, aber ich benutze dies um die Notwendigkeit zu [] in URLs zu entfernen, ohne sich Gedanken über das Neuschreiben zu machen.

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