Pobierz parametry ciągu zapytania URL

Jaki jest sposób" mniej kodu potrzebnego", aby uzyskać parametry z ciągu zapytań URL, który jest sformatowany w następujący sposób?

Www.mysite.com/category/subcategory?myqueryhash

Wyjście powinno być: myqueryhash

Znam takie podejście:

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
Author: jww, 2011-12-12

11 answers

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


Dokumentacja

 543
Author: Filip Roséen - refp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-10 19:32:04

Sposobem PHP jest użycie funkcji parse_url , która parsuje adres URL i zwraca jego składniki. W tym ciąg zapytania.

Przykład:

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

Pełna dokumentacja tutaj

 107
Author: medina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 22:25:10

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

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

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

Zapisze parametry do tablicy $queries ($queries['x']=100, $queries['y']=200).

Spójrz na dokumentację parse_str


EDIT

Zgodnie z dokumentacją PHP, parse_str() powinno być używane tylko z drugim parametrem. Użycie parse_str($_SERVER['QUERY_STRING']) na tym adresie URL spowoduje utworzenie zmiennych $x i $y, co sprawia, że kod podatny na ataki takie jak http://www.example.com/page.php?authenticated=1.

 92
Author: sbrbot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-27 07:12:50

Jeśli chcesz mieć cały łańcuch zapytania:

$_SERVER["QUERY_STRING"]
 45
Author: Jason T Featheringham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 03:58:42

Polecam 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:

Witaj Hannes!
 28
Author: user3816325,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 16:49:33

Również jeśli szukasz bieżącej nazwy pliku wraz z ciągiem zapytania, będziesz potrzebować następującego

basename($_SERVER['REQUEST_URI'])

Dostarczy Ci informacji, takich jak Poniższy przykład

Plik.php?arg1 = val&arg2=val

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

$_SERVER['REQUEST_URI']
 5
Author: K. Shahzad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-02 08:44:25

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

Http://php.net/manual/en/function.parse-str.php#76792 Napisy dla Evan K.

Należy wspomnieć, że wbudowany parse_str nie przetwarza ciągu zapytania w standardowy sposób CGI, jeśli chodzi o zduplikowane pola. Jeśli w łańcuchu zapytań istnieje wiele pól o tej samej nazwie, każdy inny język przetwarzania sieci Web odczyta je do tablica, 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');
?>

Zamiast tego, PHP używa niestandardowej praktyki umieszczania nawiasów w nazwach pól, aby osiągnąć ten sam efekt.

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

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>
To może być mylące dla każdego, kto jest przyzwyczajony do standardu CGI, więc miej to na uwadze. Jako alternatywę używam "właściwej" funkcji parsera querystring:
<?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']);
?>
 5
Author: aimiliano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-18 08:58:44

Oto moja funkcja do odbudowy części ciągu zapytaniaREFERRER ' s .

Jeśli strona wywołująca ma już łańcuch zapytania w swoim własnym URL , i musisz wrócić do tej strony i chcesz odesłać niektóre, nie wszystkie, z tych zmiennych $_GET (np. numer strony).

Przykład: łańcuch zapytania Referrera był ?foo=1&bar=2&baz=3 wywołanie refererQueryString( 'foo' , 'baz' ) zwraca 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
Author: Adriana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 19:58:13

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 mi pomogło. Mam nadzieję, że to również wam pomoże:)
 4
Author: Kamlesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 14:38:06

Podziękowania dla @K. Shahzad Pomaga to, gdy chcesz przepisać ciąg zapytania bez żadnych poprawek. Powiedzmy, że przepisujesz / test/?x = y do indeksu.php?q = test&x = y i 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();
 3
Author: Sjaak Wish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 14:41:24

Aby uzyskać każdy węzeł w URI, możesz użyć funkcji explode() do $_SERVER ['REQUEST_URI']. Jeśli chcesz uzyskać ciągi bez wiedzy, czy jest przekazywana, czy nie. możesz użyć funkcji, którą sam zdefiniowałem, aby uzyskać parametry zapytania z $_REQUEST(ponieważ działa zarówno dla param 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, kiedy chcemy uzyskać parametry zapytania przekonwertowane na typ Integer, więc dodałem trzeci parametr do tej funkcji.

 2
Author: Paul Z.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 13:51:33