web-dev-qa-db-ja.com

同じ識別子を持つ複数のHTTP GETパラメータ

次のようなリクエストを受け取っているとします。

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

私のphpコード内で簡単な方法でこれらを抽出することは可能ですか? window.location.hrefを使用してJavaScriptでクエリ文字列全体を取得し、手動で処理できることを理解していますが、もっとエレガントなものを探しています。リクエストには任意の数のバージョン/ IDペアを含めることができますが、クエリは整形式であり、無効な文字列を処理する義務がないと想定できます。

13
MatsT

PHP manual からのこのコメント)によると、PHPのクエリ文字列パーサーは重複したパラメータをドロップします...そのため、PHPは、やりたいことにぴったりです(ただし、javascriptと同じ容量で生のクエリ文字列を取得できるので、好きなことができます)

7
Brian Driscoll

フィールド名を変更して[]を含めることができる場合、PHPは、一致するすべての値を含む配列を作成します。

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

フィールド名を変更する機能がない場合は、あなたが言うように、自分でクエリ文字列を解析する必要があります。

26
Jacob Mattison

リクエストをある程度制御できると想定して、名前の後に[]およびPHPは、1つを除くすべてをドロップする代わりに配列を生成します。

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

それらはpairsであるため、インデックスを使用する際に表示される順序を修正する必要があります。

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

$ _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
Vitor Marques

上記の方法ほど丸めたり信頼性はありませんが、これを使用して[]書き換えを心配せずに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));
        }
    }
}
0
atoms