Ottieni i parametri della stringa di query URL


322

Qual è il modo "meno codice necessario" per ottenere parametri da una stringa di query URL che è formattata come la seguente?

www.mysite.com/category/subcategory?myqueryhash

L'output dovrebbe essere: myqueryhash

Sono consapevole di questo approccio:

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

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

Risposte:


527

$_SERVER['QUERY_STRING'] contiene i dati che stai cercando.


DOCUMENTAZIONE


28
print_r ($ _ SERVER) per trovare i valori correlati

22
nota: $_SERVER['QUERY_STRING']mostrerà foo=bar2per stringa di query comefoo=bar1&foo=bar2
Timo Huovinen

3
Per ottenere un output più leggibile, si può avvolgere la print_r()dichiarazione <pre>tag: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali,

1
@RJAnoop In tal caso, qstring fa parte dell'URL, quindi puoi usarlo $_SERVER['REQUEST_URI'], anche se potresti voler considerare l'uso di mod_rewrite per passare quella parte dell'URL come variabile. Vedi stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
Quindi perché è meglio che usare $ _GET?
still_dreaming_1

92

Il modo PHP per farlo è usare la funzione parse_url , che analizza un URL e restituisce i suoi componenti. Inclusa la stringa di query.

Esempio:

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

Documentazione completa qui


15
Questa è in realtà la migliore risposta in base alla domanda. Le altre risposte ottengono solo l' URI corrente, mentre la domanda specifica solo "dall'URL".
Chris Harrison,

80

La funzione parse_str()legge automaticamente tutti i parametri della query in un array.

Ad esempio, se l'URL è http://www.example.com/page.php?x=100&y=200, il codice

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

memorizzerà i parametri $queriesnell'array ( $queries['x']=100, $queries['y']=200).

Guarda la documentazione di parse_str


MODIFICARE

Secondo la documentazione di PHP, parse_str()dovrebbe essere usato solo con un secondo parametro. L'utilizzo parse_str($_SERVER['QUERY_STRING'])su questo URL creerà variabili $xe $y, il che rende il codice vulnerabile ad attacchi come http://www.example.com/page.php?authenticated=1.


52
..e è una funzione malvagia e malvagia che non dovrebbe esistere.
Zenexer,

6
Zenexer puoi elaborare un po 'di più la tua affermazione? Perché questo è un male?
sbrbot,

26
Non si dovrebbe mai trasformare ciecamente i parametri di querystring in variabili. Cosa pensi che accada se qualcuno usa una chiave che corrisponde a una variabile reale? Chiede exploit. Ecco perché questa funzione è altamente scoraggiata. Puoi impostare PHP per farlo automaticamente, senza chiamare parse_str, ma naturalmente è considerato un no-no.
Zenexer,

42
È possibile utilizzare il secondo parametro di parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- ora l' $paramsarray conterrà tutti i valori della stringa di query.
Amal Murali,

13
"Non si dovrebbe mai trasformare ciecamente i parametri di querystring in variabili" Tali affermazioni sono totalmente assurde. "Mai" -> come fai a sapere che tipo di situazioni vivrà un determinato programmatore in un'ora casuale di una giornata lavorativa casuale ........ Assurdità assolute. Non esiste una parola come "mai". NIENTE è pericoloso quando lo usi in modo sbagliato, QUALCOSA è utile quando lo usi in modo corretto ....... 10 anni fa molte persone parlavano così degli IFRAME. male, stupidità assoluta. rischio di sicurezza assoluto. poi è arrivato facebook, poi è diventato social, iframe dappertutto e nessuno sta parlando così adesso ....
unity100


25

Raccomanderò la migliore risposta come

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

Supponendo che l'utente abbia inserito http://example.com/?name=Hannes

L'esempio sopra mostrerà:

Ciao Hannes!


4
Questo è il modo più rapido e semplice per ottenere i var dalla stringa di query fornita.
Mirko Brunner,

2
L'OP ha chiesto come ottenere la query param dall'URL example.com/?Hannes...
Philipp

5

Inoltre, se stai cercando il nome del file corrente insieme alla stringa di query, dovrai solo seguire

basename($_SERVER['REQUEST_URI'])

Ti fornirebbe informazioni come nel seguente esempio

file.php? arg1 = val & arg2 = val

E se vuoi anche il percorso completo del file a partire dalla radice, ad esempio /folder/folder2/file.php?arg1=val&arg2=val, rimuovi semplicemente la funzione basename () e usa semplicemente il flusso di file

$_SERVER['REQUEST_URI']

2
/è un carattere valido nelle stringhe di query (vedi RFC 3986 ), quindi non puoi fare affidamento basename.
Cairnarvon,

1
Questo non funzionerà se la stringa di query ha una barra, ed è quindi insicura. È meglio ottenere la stringa di query, rimuoverla dalla fine dell'URI della richiesta, quindi eseguire basename () - quindi, naturalmente, aggiungere la stringa di query alla fine.
Zenexer,

4

Ecco la mia funzione per ricostruire parti della stringa di query di REFERRER .

Se la pagina chiamante aveva già una stringa di query nel proprio URL e si deve tornare a quella pagina e si desidera rispedire alcuni, non tutti, di quei $_GETvar (ad esempio un numero di pagina).

Esempio: la stringa di query del referrer stava ?foo=1&bar=2&baz=3chiamando refererQueryString( 'foo' , 'baz' )return 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

Questo codice e notazione non sono miei. Evan K risolve una query multi-valore con lo stesso nome con una funzione personalizzata;) è presa da:

http://php.net/manual/en/function.parse-str.php#76792 I crediti vanno a Evan K.

Vale la pena ricordare che il builtin parse_str NON elabora una stringa di query in modo standard CGI, quando si tratta di campi duplicati. Se in una stringa di query esistono più campi con lo stesso nome, ogni altro linguaggio di elaborazione web li leggerebbe in un array, ma PHP li sovrascrive silenziosamente:

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

Grazie a @K. Shahzad Questo aiuta quando si desidera la stringa di query riscritta senza alcuna aggiunta di riscrittura. Supponiamo di riscrivere / test /? X = y in index.php? Q = test & x = y e si desidera solo la stringa di query.

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

Linguaggio di programmazione: 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'];

Questo ha funzionato per me. Spero che ti aiuterà anche :)


Output: il valore del parametro v è qnMxsGeDz90
Kamlesh

1

Per ottenere ciascun nodo nell'URI, è possibile utilizzare la funzione explode()in $ _SERVER ['REQUEST_URI']. Se vuoi ottenere le stringhe senza sapere se è passato o meno. puoi usare la funzione che ho definito per ottenere parametri di query da $ _REQUEST (poiché funziona sia per i parametri POST che 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;
}

Potrebbero esserci alcuni casi in cui vogliamo convertire i parametri di query nel tipo intero, quindi ho aggiunto il terzo parametro a questa funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.