Dapatkan parameter string kueri URL

322

Apa cara "kode kurang diperlukan" untuk mendapatkan parameter dari string kueri URL yang diformat seperti berikut?

www.mysite.com/category/subcategory?myqueryhash

Output harus: myqueryhash

Saya mengetahui pendekatan ini:

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

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

Jawaban:

527

$_SERVER['QUERY_STRING'] berisi data yang Anda cari.


DOKUMENTASI

Filip Roséen - ref
sumber
28
print_r ($ _ SERVER) untuk menemukan nilai terkait
22
catatan: $_SERVER['QUERY_STRING']akan ditampilkan foo=bar2untuk string kueri sepertifoo=bar1&foo=bar2
Timo Huovinen
3
Untuk mendapatkan output lebih mudah dibaca, Anda dapat membungkus print_r()pernyataan dalam <pre>tag: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali
1
@RJAnoop Dalam hal ini, qstring adalah bagian dari URL sehingga Anda dapat menggunakan $_SERVER['REQUEST_URI'], meskipun Anda mungkin ingin mempertimbangkan untuk menggunakan mod_rewrite untuk meneruskan bagian URL sebagai variabel. Lihat stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability
5
Jadi mengapa ini lebih baik daripada menggunakan $ _GET?
still_dreaming_1
92

Cara PHP untuk melakukannya adalah menggunakan fungsi parse_url , yang mem-parsing URL dan mengembalikan komponen-komponennya. Termasuk string kueri.

Contoh:

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

Dokumentasi lengkap di sini

medina
sumber
15
Ini sebenarnya jawaban terbaik berdasarkan pertanyaan. Jawaban lain hanya mendapatkan URI saat ini sedangkan pertanyaan hanya menentukan "dari URL".
Chris Harrison
80

Fungsi parse_str()secara otomatis membaca semua parameter kueri ke dalam array.

Misalnya, jika URL-nya http://www.example.com/page.php?x=100&y=200, kodenya

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

akan menyimpan parameter ke dalam $queriesarray ( $queries['x']=100, $queries['y']=200).

Lihatlah dokumentasi parse_str


EDIT

Menurut dokumentasi PHP, parse_str()seharusnya hanya digunakan dengan parameter kedua. Menggunakan parse_str($_SERVER['QUERY_STRING'])URL ini akan membuat variabel $xdan $y, yang membuat kode rentan terhadap serangan seperti http://www.example.com/page.php?authenticated=1.

sbrbot
sumber
52
..dan adalah kejahatan, fungsi jahat yang seharusnya tidak ada.
Zenexer
6
Zenexer, bisakah Anda sedikit merinci pernyataan Anda? MENGAPA ini jahat?
sbrbot
26
Anda seharusnya tidak mengubah parameter querystring menjadi variabel. Menurut Anda apa yang terjadi jika seseorang menggunakan kunci yang sesuai dengan variabel nyata? Ia meminta eksploitasi. Itu sebabnya fitur ini sangat tidak disarankan. Anda dapat mengatur PHP untuk melakukan ini secara otomatis, tanpa menelepon parse_str, tetapi tentu saja itu dianggap sebagai tidak-tidak.
Zenexer
42
Anda dapat menggunakan parameter kedua parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- $paramsarray sekarang akan berisi semua nilai string kueri.
Amal Murali
13
"Anda seharusnya tidak mengubah parameter querystring menjadi variabel secara membabi buta" Pernyataan seperti itu benar-benar tidak masuk akal. "Tidak pernah" -> bagaimana Anda tahu situasi seperti apa yang akan dialami oleh pembuat kode mana pada jam acak dari hari kerja acak ........ Omong kosong. Tidak ada kata 'tidak pernah'. APA SAJA berbahaya ketika Anda menggunakannya salah, APA SAJA berguna ketika Anda menggunakannya dengan benar ....... 10 tahun yang lalu banyak orang berbicara seperti itu mengenai IFRAME. kejahatan, kebodohan mutlak. risiko keamanan absolut. kemudian datang facebook, kemudian datang sosial, iframe di mana-mana dan tidak ada yang berbicara seperti itu sekarang ....
unity100
42

Jika Anda ingin seluruh string kueri:

$_SERVER["QUERY_STRING"]
Jason T Featheringham
sumber
25

Saya akan merekomendasikan jawaban terbaik sebagai

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

Dengan asumsi pengguna memasukkan http://example.com/?name=Hannes

Contoh di atas akan menampilkan:

Halo Hannes!

pengguna3816325
sumber
4
Ini adalah cara tercepat dan termudah untuk mendapatkan vars dari string kueri yang diberikan.
Mirko Brunner
2
OP bertanya bagaimana cara mendapatkan param kueri dari URL example.com/?Hannes...
Philipp
5

Juga jika Anda mencari nama file saat ini bersama dengan string kueri, Anda hanya perlu mengikuti

basename($_SERVER['REQUEST_URI'])

Ini akan memberi Anda info seperti contoh berikut

file.php? arg1 = val & arg2 = val

Dan jika Anda juga menginginkan path lengkap file juga mulai dari root, misal /folder/folder2/file.php?arg1=val&arg2=val maka hapus saja fungsi basename () dan gunakan pengisian saja

$_SERVER['REQUEST_URI']
K. Shahzad
sumber
2
/adalah karakter yang valid dalam string kueri (lihat RFC 3986 ), jadi Anda tidak dapat mengandalkan basename.
Cairnarvon
1
Ini tidak akan berfungsi jika querystring memiliki garis miring, dan karenanya tidak aman. Anda lebih baik mendapatkan querystring, menghapusnya dari akhir URI permintaan, lalu menjalankan basename () - lalu, tentu saja, tambahkan querystring ke akhir.
Zenexer
4

Inilah fungsi saya untuk membangun kembali bagian-bagian dari string kueri REFERRER .

Jika halaman panggilan sudah memiliki string kueri di URL -nya sendiri , dan Anda harus kembali ke halaman itu dan ingin mengirim kembali sebagian, tidak semua, dari $_GETvars itu (mis. Nomor halaman).

Contoh: String kueri pengarah ?foo=1&bar=2&baz=3menelepon refererQueryString( 'foo' , 'baz' )pengembalian 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'));
Adriana
sumber
4

Kode dan notasi ini bukan milik saya. Evan K memecahkan kueri nama multi nilai yang sama dengan fungsi kustom;) diambil dari:

http://php.net/manual/en/function.parse-str.php#76792 Kredit diberikan ke Evan K.

Perlu disebutkan bahwa parse_str builtin TIDAK memproses string kueri dengan cara standar CGI, ketika datang ke bidang duplikat. Jika beberapa bidang dengan nama yang sama ada dalam string kueri, setiap bahasa pemrosesan web lainnya akan membacanya menjadi sebuah array, tetapi PHP diam-diam menimpa mereka:

<?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']);
?>
aimiliano
sumber
3

Terima kasih kepada @K. Shahzad Ini membantu saat Anda menginginkan string kueri yang ditulis ulang tanpa penambahan apa pun. Katakanlah Anda menulis ulang / test /? X = y ke index.php? Q = test & x = y dan Anda hanya menginginkan string kueri.

function get_query_string(){

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

Bahasa Pemrograman: 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'];

Ini berhasil untuk saya. Saya harap, ini juga akan membantu Anda :)

Kamlesh
sumber
Output: nilai parameter v adalah qnMxsGeDz90
Kamlesh
1

Untuk mendapatkan setiap simpul di URI, Anda dapat menggunakan fungsi explode()untuk $ _SERVER ['REQUEST_URI']. Jika Anda ingin mendapatkan string tanpa mengetahui apakah itu lulus atau tidak. Anda dapat menggunakan fungsi yang saya definisikan sendiri untuk mendapatkan parameter kueri dari $ _REQUEST (karena berfungsi baik untuk POST dan GET params).

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

Mungkin ada beberapa kasus ketika kita ingin mendapatkan parameter kueri dikonversi menjadi tipe Integer, jadi saya menambahkan parameter ketiga ke fungsi ini.

Paul Z.
sumber