URL sorgu dizesi parametrelerini alma


322

Aşağıdaki gibi biçimlendirilmiş bir URL sorgu dizesinden parametre almanın "daha az kod gerekli" yolu nedir?

www.mysite.com/category/subcategory?myqueryhash

Çıktı şöyle olmalıdır: myqueryhash

Bu yaklaşımın farkındayım:

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

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

Yanıtlar:


527

$_SERVER['QUERY_STRING'] aradığınız verileri içerir.


BELGELER


28
print_r ($ _ SERVER) ilgili değerleri bulmak için

22
not: gibi sorgu dizesi için $_SERVER['QUERY_STRING']gösterilecekfoo=bar2foo=bar1&foo=bar2
Timo Huovinen

3
Daha okunabilir bir çıktı elde etmek için, sarabilirsiniz print_r()deyimini <pre>etiketleri: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali

1
@RJAnoop Bu durumda, URL'nin bir kısmını $_SERVER['REQUEST_URI']değişken olarak geçirmek için mod_rewrite kullanmayı düşünebilirsiniz, ancak qstring URL'nin bir parçasıdır. Bkz. Stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
Peki bu neden $ _GET kullanmaktan daha iyi?
still_dreaming_1

92

Bunu yapmanın PHP yolu , bir URL'yi ayrıştıran ve bileşenlerini döndüren parse_url işlevini kullanmaktır . Sorgu dizesi dahil.

Misal:

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

Tam dokümantasyon burada


15
Bu aslında soruya dayanan en iyi cevaptır. Diğer yanıtlar yalnızca geçerli URI'yi alırken, soru yalnızca "URL'den" seçeneğini belirtir.
Chris Harrison

80

İşlev parse_str()otomatik olarak tüm sorgu parametrelerini bir diziye okur.

Örneğin, URL ise http://www.example.com/page.php?x=100&y=200, kod

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

parametreleri $queriesdiziye ( $queries['x']=100, $queries['y']=200) kaydeder .

Bak parse_str belgelenmesi


DÜZENLE

PHP belgelerine göre, parse_str()sadece ikinci bir parametre ile kullanılmalıdır. parse_str($_SERVER['QUERY_STRING'])Bu URL'de kullanmak değişkenler oluşturur $xve $ybu da kodu gibi saldırılara açık hale getirir http://www.example.com/page.php?authenticated=1.


52
..ve var olmaması gereken kötü, kötü bir işlevdir.
Zenexer

6
Zenexer ifadenizi biraz daha ayrıntılandırabilir misiniz? Neden bu bir kötülük?
sbrbot

26
Sorgu dizesi parametrelerini asla değişkenlere körü körüne dönüştürmemelisiniz. Birisi gerçek bir değişkene karşılık gelen bir anahtar kullanırsa ne olur? İstismar istiyor. Bu yüzden bu özellik kesinlikle önerilmez. PHP'yi arama yapmadan bunu otomatik olarak yapacak şekilde ayarlayabilirsiniz parse_str, ancak doğal olarak, hayır-hayır olarak kabul edilir.
Zenexer

42
Parse_str () parametresinin ikinci parametresini kullanabilirsiniz. - parse_str($_SERVER['QUERY_STRING'], $params);- now $paramsdizisi tüm sorgu dizesi değerlerini içerecektir.
Amal Murali

13
"Sorgu dizisi parametrelerini asla körü körüne değişkenlere dönüştürmemelisiniz" Bu ifadeler tamamen saçmadır. "Asla" -> herhangi bir kodlayıcı rastgele bir iş günü rastgele bir saatte nasıl bir durum yaşayacağını nasıl biliyorsun ........ Mutlak saçmalık. 'Asla' diye bir kelime yoktur. Yanlış kullandığınızda HER ŞEY tehlikelidir, doğru kullandığınızda HER ŞEY yararlı olur ....... 10 yıl önce IFRAME'lerle ilgili birçok insan böyle konuşuyordu. kötü, mutlak aptallık. mutlak güvenlik riski. sonra facebook geldi, sonra sosyal geldi, iframe her yerde ve kimse şimdi böyle konuşmuyor ....
unity100


25

En iyi yanıtı önereceğim

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

Kullanıcının http://example.com/?name=Hannes girdiği varsayılarak

Yukarıdaki örnek çıktı verecektir:

Merhaba Hannes!


4
Bu, verilen sorgu dizesinden değişkenleri almanın en hızlı ve en kolay yoludur.
Mirko Brunner

2
OP URL'den sorgu parametresini nasıl alacağını sordu example.com/?Hannes...
Philipp

5

Ayrıca sorgu dizesiyle birlikte geçerli dosya adını arıyorsanız, aşağıdakileri yapmanız gerekir:

basename($_SERVER['REQUEST_URI'])

Aşağıdaki örnek gibi bilgiler sağlar

file.php? arg1 = val & arg2 = val

Ayrıca, kökten başlayarak dosyanın tam yolunu da istiyorsanız, örneğin /folder/folder2/file.php?arg1=val&arg2=val sonra basename () işlevini kaldırın ve yalnızca tarama işlevini kullanın

$_SERVER['REQUEST_URI']

2
/sorgu dizelerinde geçerli bir karakterdir (bkz. RFC 3986 ), bu nedenle güvenemezsiniz basename.
Cairnarvon

1
Sorgu dizesi eğik çizgi içeriyorsa bu nedenle çalışmaz ve bu nedenle güvensizdir. Sorgu dizesini almak, istek URI'sinin sonundan çıkarmak, sonra basename () çalıştırmak daha iyidir - o zaman, elbette, sorgu dizesini sonuna ekleyin.
Zenexer

4

İşte REFERRER sorgu dizesinin bölümlerini yeniden oluşturmak için benim işlev .

Çağıran sayfanın zaten kendi URL'sinde bir sorgu dizesi varsa ve bu sayfaya geri dönmeniz ve bu $_GETdeğişkenlerin tümünü değil, bazılarını (örneğin bir sayfa numarası) geri göndermek istiyorsanız .

Örnek: Yönlendirenin sorgu dizesi döndürme ?foo=1&bar=2&baz=3çağırıyordu :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

Bu kod ve gösterim benim değil. Evan K, çok değerli aynı isim sorgusunu özel bir işlevle çözer;)

http://php.net/manual/en/function.parse-str.php#76792 Kredi Evan K.'ye gidiyor.

Yinelenen alanlar söz konusu olduğunda, parse_str yerleşiminin bir sorgu dizesini CGI standart yolunda işlemediğinden bahsetmektedir. Bir sorgu dizesinde aynı ada sahip birden çok alan varsa, diğer tüm web işleme dilleri bunları bir diziye okur, ancak PHP sessizce bunların üzerine yazar:

<?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 sayesinde. Shahzad Bu, yeniden yazılmış sorgu dizesini herhangi bir yeniden yazma eklemesi olmadan istediğinizde yardımcı olur. Diyelim ki / test /? X = y dizinini.php? Q = test & x = y olarak yeniden yazdığınızı ve yalnızca sorgu dizesini istediğinizi varsayalım.

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

Programlama Dili: 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'];

Bu benim için çalıştı. Umarım size de yardımcı olur :)


Çıkış: v parametresi değeri qnMxsGeDz90 olduğu
Kamlesh

1

URI'deki her düğümü almak explode()için, $ _SERVER ['REQUEST_URI'] işlevini kullanabilirsiniz . Eğer geçip geçmediğini bilmeden dizeleri almak istiyorsanız. $ _REQUEST (hem POST hem de GET parametreleri için çalıştığı için) sorgu parametrelerini almak için kendimi tanımladığım işlevi kullanabilirsiniz.

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

Sorgu parametrelerini Tamsayı türüne dönüştürmek istediğimizde bazı durumlar olabilir, bu nedenle bu parametreye üçüncü parametreyi ekledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.