URLクエリ文字列パラメーターを取得する


322

次のような形式のURLクエリ文字列からパラメーターを取得するための「必要なコードが少ない」方法は何ですか?

www.mysite.com/category/subcategory?myqueryhash

出力は次のようになります。 myqueryhash

私はこのアプローチを知っています:

www.mysite.com/category/subcategory?q=myquery

<?php
   echo $_GET['q'];  //Output: myquery
?>

回答:


527

$_SERVER['QUERY_STRING'] あなたが探しているデータが含まれています。


ドキュメンテーション


28
print_r($ _ SERVER)を使用して関連する値を検索

22
注:次のようなクエリ文字列に対して$_SERVER['QUERY_STRING']表示さfoo=bar2れますfoo=bar1&foo=bar2
Timo Huovinen、2013年

3
より読みやすい出力を取得するには、print_r()ステートメントを<pre>タグでラップしますecho '<pre>'.print_r($_SERVER, TRUE).'</pre>';
Amal Murali 2014年

1
@RJAnoopこの場合、qstringはURLの一部なので、を使用できますが$_SERVER['REQUEST_URI']、mod_rewriteを使用してURLのその部分を変数として渡すことを検討することもできます。参照してくださいstackoverflow.com/questions/16388959/url-rewriting-with-php
NULL可能

5
では、なぜこれが$ _GETを使用するよりも優れているのでしょうか。
still_dreaming_1 2017

92

これを行うPHPの方法は、URLを解析してそのコンポーネントを返す関数parse_urlを使用することです。クエリ文字列を含みます。

例:

$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

ここに完全なドキュメント


15
これは、質問に基づく最良の答えです。他の回答は現在の URI のみを取得しますが、質問は「from URL」のみを指定します。
Chris Harrison、

80

関数はparse_str()自動的にすべてのクエリパラメータを配列に読み込みます。

たとえば、URLがのhttp://www.example.com/page.php?x=100&y=200場合、コードは

$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);

パラメータを$queries配列($queries['x']=100$queries['y']=200)に格納します。

parse_strのドキュメントを見てください


編集

PHPのドキュメントによるparse_str()と、2番目のパラメーターでのみ使用する必要があります。使用するparse_str($_SERVER['QUERY_STRING'])変数を作成します。このURLに$x$yのような攻撃に対して脆弱コードを作成され、http://www.example.com/page.php?authenticated=1


52
..そして、存在してはならない悪、悪の機能です。
Zenexer 2013

6
Zenexerについてもう少し詳しく説明してください。なぜこれが悪なのか?
sbrbot 2013

26
クエリ文字列パラメーターを盲目的に変数に変換することはできません。誰かが実際の変数に対応するキーを使用するとどうなると思いますか?それはエクスプロイトを求めています。このため、この機能はお勧めしません。これを自動的に行うようにPHPを設定できますが、は呼び出されませんparse_strが、当然、これはノーノーと見なされます。
Zenexer 2013

42
parse_str()の2番目のパラメーターを使用できます。-- parse_str($_SERVER['QUERY_STRING'], $params);これで、$params配列にはすべてのクエリ文字列値が含まれます。
Amal Murali

13
「クエリ文字列パラメーターを盲目的に変数に変換してはなりません」そのようなステートメントはまったく馬鹿げています。「決して」->どのコーダーがランダムな就業日のランダムな時間にどのような状況を経験するかをどのようにして知ることができますか........絶対にナンセンスです。「決して」という言葉はありません。何かを間違って使用すると危険ですが、正しく使用すると便利です。......10年前、多くの人々がIFRAMEについてそのように話していました。邪悪で絶対的な愚かさ。絶対的なセキュリティリスク。その後、Facebookが来て、その後の社会来て、どこでも、アイフレームと誰もがそれになりました....のように話している
unity100


25

私はベストアンサーをお勧めします

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

ユーザーがhttp://example.com/?name=Hannesと入力したと仮定します

上記の例は出力します:

ハネスこんにちは!


4
これは、指定されたクエリ文字列から変数を取得する最も速くて簡単な方法です。
Mirko Brunner 2015年

2
OPは、URLからクエリパラメータを取得する方法を尋ねましたexample.com/?Hannes...
Philipp

5

また、クエリ文字列とともに現在のファイル名を探している場合は、次のようにする必要があります

basename($_SERVER['REQUEST_URI'])

次の例のような情報を提供します

file.php?arg1 = val&arg2 = val

また、ルートから開始するファイルの完全パスも必要な場合は、たとえば/folder/folder2/file.php?arg1=val&arg2=val次に、basename()関数を削除し、fillowingを使用します。

$_SERVER['REQUEST_URI']

2
/はクエリ文字列(RFC 3986を参照)で有効な文字であるため、に依存することはできませんbasename
Cairnarvon、2015年

1
これは、クエリ文字列にスラッシュが含まれている場合は機能しないため、安全ではありません。あなたは、リクエストURIの末尾から削除し、クエリ文字列を取得する方がいいでしょう、その後)(ベース名を実行している-そして、もちろん、最後にクエリ文字列を追加します。
Zenexer 2015年

4

これが、REFERRERのクエリ文字列一部を再構築するための関数です。

呼び出しページの独自のURLにクエリ文字列が既にあり、そのページに戻って、$_GET変数のすべてではなく一部(ページ番号など)を送り返す必要がある場合。

例:リファラーのクエリ文字列がreturnを?foo=1&bar=2&baz=3呼び出しrefererQueryString( 'foo' , 'baz' )ていましたfoo=1&baz=3"

function refererQueryString(/* var args */) {

    //Return empty string if no referer or no $_GET vars in referer available:
    if (!isset($_SERVER['HTTP_REFERER']) ||
        empty( $_SERVER['HTTP_REFERER']) ||
        empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {

        return '';
    }

    //Get URL query of referer (something like "threadID=7&page=8")
    $refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);

    //Which values do you want to extract? (You passed their names as variables.)
    $args = func_get_args();

    //Get '[key=name]' strings out of referer's URL:
    $pairs = explode('&',$refererQueryString);

    //String you will return later:
    $return = '';

    //Analyze retrieved strings and look for the ones of interest:
    foreach ($pairs as $pair) {
        $keyVal = explode('=',$pair);
        $key = &$keyVal[0];
        $val = urlencode($keyVal[1]);
        //If you passed the name as arg, attach current pair to return string:
        if(in_array($key,$args)) {
            $return .= '&'. $key . '=' .$val;
        }
    }

    //Here are your returned 'key=value' pairs glued together with "&":
    return ltrim($return,'&');
}

//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:

header('Location: page.php?'.refererQueryString('foo','baz'));

4

このコードと表記は私のものではありません。Evan Kは、カスタム関数を使用して複数値の同じ名前のクエリを解決します。

http://php.net/manual/en/function.parse-str.php#76792 クレジットはEvan Kに送られます。

重複フィールドに関しては、parse_strビルトインがCGI標準の方法でクエリ文字列を処理しないことに言及します。クエリ文字列に同じ名前の複数のフィールドが存在する場合、他のすべてのWeb処理言語はそれらを配列に読み取りますが、PHPは暗黙的にそれらを上書きします。

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');

# the above produces:
$foo = array('foo' => '3');
?>

Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

This can be confusing for anyone who's used to the CGI standard, so keep it in mind.  As an alternative, I use a "proper" querystring parser function:

<?php
function proper_parse_str($str) {
  # result array
  $arr = array();

  # split on outer delimiter
  $pairs = explode('&', $str);

  # loop through each pair
  foreach ($pairs as $i) {
    # split into name and value
    list($name,$value) = explode('=', $i, 2);

    # if name already exists
    if( isset($arr[$name]) ) {
      # stick multiple values into an array
      if( is_array($arr[$name]) ) {
        $arr[$name][] = $value;
      }
      else {
        $arr[$name] = array($arr[$name], $value);
      }
    }
    # otherwise, simply stick it in a scalar
    else {
      $arr[$name] = $value;
    }
  }

  # return result array
  return $arr;
}

$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>

3

@Kに感謝します。Shahzadこれは、書き換えを追加せずに書き換えられたクエリ文字列が必要な場合に役立ちます。/ test /?x = yをindex.php?q = test&x = yに書き換えて、クエリ文字列だけが欲しいとしましょう。

function get_query_string(){

    $arr = explode("?",$_SERVER['REQUEST_URI']);
    if (count($arr) == 2){
        return "";
    }else{
        return "?".end($arr)."<br>";
    }       
}
$query_string = get_query_string();

2

プログラミング言語:PHP

// Inintialize URL to the variable 
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90'; 

// Use parse_url() function to parse the URL 
// and return an associative array which 
// contains its various components 
$url_components = parse_url($url); 

// Use parse_str() function to parse the 
// string passed via URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is '.$params['v'];

これでうまくいきました。私も願っています、それもあなたを助けるでしょう:)


出力:vパラメーター値はqnMxsGeDz90
Kamlesh

1

URIの各ノードを取得するには、explode()$ _ SERVER ['REQUEST_URI']への関数を使用できます。渡されたかどうかわからない文字列を取得したい場合。私が自分で定義した関数を使用して、$ _ REQUESTからクエリパラメータを取得できます(POSTパラメータとGETパラメータの両方で機能するため)。

function getv($key, $default = '', $data_type = '')
{
    $param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);

    if (!is_array($param) && $data_type == 'int') {
        $param = intval($param);
    }

    return $param;
}

クエリパラメータを整数型に変換したい場合があるので、この関数に3番目のパラメータを追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.