Uzyskaj parametry ciągu zapytania URL


322

Jaki jest „mniej potrzebny kod”, aby uzyskać parametry z ciągu zapytania adresu URL, który jest sformatowany w następujący sposób?

www.mysite.com/category/subcategory?myqueryhash

Dane wyjściowe powinny wynosić: myqueryhash

Mam świadomość tego podejścia:

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

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

Odpowiedzi:


527

$_SERVER['QUERY_STRING'] zawiera dane, których szukasz.


DOKUMENTACJA


28
print_r ($ _ SERVER), aby znaleźć powiązane wartości

22
uwaga: $_SERVER['QUERY_STRING']pokaże foo=bar2dla zapytania ciąg taki jakfoo=bar1&foo=bar2
Timo Huovinen

3
Aby uzyskać wyjście bardziej czytelny, można owinąć print_r()oświadczenie w <pre>tagach: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali

1
@RJAnoop W takim przypadku qstring jest częścią adresu URL, więc możesz go użyć $_SERVER['REQUEST_URI'], chociaż możesz rozważyć użycie mod_rewrite do przekazania tej części adresu URL jako zmiennej. Zobacz stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
Dlaczego to jest lepsze niż używanie $ _GET?
still_dreaming_1

91

Aby to zrobić w PHP, należy użyć funkcji parse_url , która analizuje adres URL i zwraca jego składniki. Łącznie z ciągiem zapytania.

Przykład:

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

Pełna dokumentacja tutaj


15
To właściwie najlepsza odpowiedź na podstawie pytania. Inne odpowiedzi otrzymują tylko bieżący identyfikator URI, podczas gdy pytanie określa tylko „z adresu URL”.
Chris Harrison

80

Funkcja parse_str()automatycznie odczytuje wszystkie parametry zapytania do tablicy.

Na przykład, jeśli adres URL to http://www.example.com/page.php?x=100&y=200kod

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

zapisze parametry w $queriestablicy ( $queries['x']=100, $queries['y']=200).

Zobacz dokumentację parse_str


EDYTOWAĆ

Zgodnie z dokumentacją PHP parse_str()należy używać tylko z drugim parametrem. Użycie parse_str($_SERVER['QUERY_STRING'])tego adresu URL spowoduje utworzenie zmiennych $xi $y, co czyni kod podatnym na ataki takie jak http://www.example.com/page.php?authenticated=1.


52
... i jest złą, złą funkcją, która nie powinna istnieć.
Zenexer

6
Zenexer, czy możesz bardziej szczegółowo rozwinąć swoje oświadczenie? DLACZEGO to jest zło?
sbrbot

26
Nigdy nie należy ślepo przekształcać parametrów zapytania w zmienne. Jak myślisz, co się stanie, jeśli ktoś użyje klucza odpowiadającego rzeczywistej zmiennej? Prosi o exploity. Dlatego ta funkcja jest wysoce odradzana. Możesz ustawić PHP, aby robiło to automatycznie, bez wywoływania parse_str, ale oczywiście jest to uważane za nie-nie.
Zenexer

42
Możesz użyć drugiego parametru parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- teraz $paramstablica będzie zawierać wszystkie wartości ciągu zapytania.
Amal Murali,

13
„Nigdy nie powinieneś ślepo przekształcać parametrów zapytania w zmienne”. Takie stwierdzenia są całkowicie absurdalne. „Nigdy” -> skąd wiesz, jakie sytuacje napotka dany programista w przypadkowej godzinie losowego dnia roboczego ........ Absolutny nonsens. Nie ma takiego słowa jak „nigdy”. WSZYSTKO jest niebezpieczne, gdy używasz go niewłaściwie, WSZYSTKO jest przydatne, gdy używasz go właściwie ... 10 lat temu wiele osób mówiło w ten sposób o IFRAMACH. zło, absolutna głupota. absolutne ryzyko bezpieczeństwa. potem pojawił się facebook, potem pojawił się
portal


25

Polecę najlepszą odpowiedź jako

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

Zakładając, że użytkownik wprowadził http://example.com/?name=Hannes

Powyższy przykład wyświetli:

Cześć Hannes!


4
Jest to najszybszy i najłatwiejszy sposób na uzyskanie zmiennych z podanego ciągu zapytania.
Mirko Brunner

2
OP zapytał, jak uzyskać parametr zapytania z adresu URL example.com/?Hannes...
Philipp

5

Również, jeśli szukasz bieżącej nazwy pliku wraz z ciągiem zapytania, wystarczy wykonać następujące czynności

basename($_SERVER['REQUEST_URI'])

Dostarczy ci informacji takich jak następujący przykład

file.php? arg1 = val & arg2 = val

A jeśli chcesz również pełną ścieżkę do pliku, zaczynając od katalogu głównego, np. /Folder/folder2/file.php?arg1=val&arg2=val, po prostu usuń funkcję basename () i użyj wypełniania

$_SERVER['REQUEST_URI']

2
/jest poprawnym znakiem w ciągach zapytań (patrz RFC 3986 ), więc nie można na nim polegać basename.
Cairnarvon

1
To nie zadziała, jeśli kwerenda zawiera ukośnik i dlatego jest niepewna. Lepiej jest uzyskać kwerendę, usunąć ją z końca identyfikatora URI żądania, a następnie uruchomić basename () - a następnie oczywiście dodać kwerendę na końcu.
Zenexer

4

Oto moja funkcja odbudowywania części ciągu zapytania REFERRERA .

Jeśli strona wywołująca ma już ciąg zapytania we własnym adresie URL i musisz wrócić do tej strony i chcesz odesłać niektóre, nie wszystkie, $_GETzmienne (np. Numer strony).

Przykład: ciąg zapytania strony odsyłającej ?foo=1&bar=2&baz=3wywoływał refererQueryString( 'foo' , 'baz' )zwroty 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

Ten kod i notacja nie są moje. Evan K rozwiązuje zapytanie o tej samej nazwie o wielu wartościach za pomocą funkcji niestandardowej;) pochodzi z:

http://php.net/manual/en/function.parse-str.php#76792 Kredyty należą do Evana K.

Należy wspomnieć, że wbudowane parse_str NIE przetwarza ciągu zapytania w standardowy sposób CGI, jeśli chodzi o duplikaty pól. Jeśli w ciągu zapytania istnieje wiele pól o tej samej nazwie, każdy inny język przetwarzania w sieci odczyta je do tablicy, ale PHP po cichu je nadpisuje:

<?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

Dzięki @K. Shahzad Pomaga to, gdy chcesz przerobiony ciąg zapytania bez żadnych dodatków przepisywania. Załóżmy, że przepisałeś / test /? X = y do index.php? Q = test & x = y, a chcesz tylko ciąg zapytania.

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

Język programowania: 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'];

To zadziałało dla mnie. Mam nadzieję, że ci to pomoże :)


Wyjście: v wartość parametru to qnMxsGeDz90
Kamlesh

1

Aby uzyskać każdy węzeł w URI, możesz użyć funkcji explode()$ _SERVER ['REQUEST_URI']. Jeśli chcesz uzyskać ciągi, nie wiedząc, czy zostało ono przekazane, czy nie. możesz użyć funkcji, którą sam zdefiniowałem, aby uzyskać parametry zapytania z $ _REQUEST (ponieważ działa zarówno dla parametrów POST, jak i 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;
}

Mogą wystąpić przypadki, w których chcemy przekonwertować parametry zapytania na liczbę całkowitą, więc do tej funkcji dodałem trzeci parametr.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.