Parameter für URL-Abfragezeichenfolgen abrufen


321

Wie wird weniger Code benötigt, um Parameter aus einer URL-Abfragezeichenfolge abzurufen, die wie folgt formatiert ist?

www.mysite.com/category/subcategory?myqueryhash

Die Ausgabe sollte sein: myqueryhash

Mir ist dieser Ansatz bekannt:

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

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

Antworten:


526

$_SERVER['QUERY_STRING'] enthält die Daten, die Sie suchen.


DOKUMENTATION


28
print_r ($ _ SERVER), um verwandte Werte zu finden

22
Hinweis: $_SERVER['QUERY_STRING']wird foo=bar2für Abfragezeichenfolge wiefoo=bar1&foo=bar2
Timo Huovinen

3
Um eine besser lesbare Ausgabe zu erhalten, können Sie die print_r()Anweisung in <pre>Tags einschließen : echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali

1
@RJAnoop In diesem Fall ist qstring Teil der URL, sodass Sie sie verwenden können $_SERVER['REQUEST_URI'], obwohl Sie möglicherweise mod_rewrite verwenden möchten, um diesen Teil der URL als Variable zu übergeben. Siehe stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
Warum ist das besser als $ _GET?
still_dreaming_1

91

Die PHP-Methode besteht darin, die Funktion parse_url zu verwenden , die eine URL analysiert und ihre Komponenten zurückgibt . Einschließlich der Abfragezeichenfolge.

Beispiel:

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

Vollständige Dokumentation hier


15
Dies ist tatsächlich die beste Antwort basierend auf der Frage. Die anderen Antworten erhalten nur den aktuellen URI, während die Frage nur "von URL" angibt.
Chris Harrison

80

Die Funktion parse_str()liest automatisch alle Abfrageparameter in ein Array.

Wenn die URL beispielsweise http://www.example.com/page.php?x=100&y=200der Code ist

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

speichert Parameter im $queriesArray ( $queries['x']=100, $queries['y']=200).

Schauen Sie sich die Dokumentation von parse_str an


BEARBEITEN

Laut PHP-Dokumentation parse_str()sollte nur mit einem zweiten Parameter verwendet werden. Wenn Sie parse_str($_SERVER['QUERY_STRING'])diese URL verwenden, werden Variablen $xund erstellt $y, wodurch der Code für Angriffe wie z http://www.example.com/page.php?authenticated=1.


52
..und ist eine böse, böse Funktion, die es nicht geben sollte.
Zenexer

6
Zenexer, können Sie Ihre Aussage etwas näher erläutern? Warum ist das ein Übel?
Sbrbot

26
Sie sollten Querystring-Parameter niemals blind in Variablen umwandeln. Was passiert Ihrer Meinung nach, wenn jemand einen Schlüssel verwendet, der einer realen Variablen entspricht? Es bittet um Exploits. Aus diesem Grund wird von dieser Funktion dringend abgeraten. Sie können PHP so einstellen, dass dies automatisch geschieht, ohne anzurufen parse_str, aber natürlich wird es als Nein-Nein betrachtet.
Zenexer

42
Sie können den zweiten Parameter von parse_str () verwenden. - parse_str($_SERVER['QUERY_STRING'], $params);- Jetzt $paramsenthält das Array alle Werte für Abfragezeichenfolgen.
Amal Murali

13
"Sie sollten Querystring-Parameter niemals blind in Variablen umwandeln." Solche Aussagen sind völlig absurd. "Niemals" -> Woher wissen Sie, welche Situationen ein bestimmter Codierer an einer zufälligen Stunde eines zufälligen Arbeitstages erleben wird? Absoluter Unsinn. Es gibt kein Wort wie "nie". ALLES ist gefährlich, wenn Sie es falsch verwenden. ALLES ist nützlich, wenn Sie es richtig verwenden. Vor 10 Jahren sprachen viele Leute so über IFRAMEs. böse, absolute Dummheit. absolutes Sicherheitsrisiko. Dann kam Facebook, dann kam Social, Iframes überall und niemand spricht jetzt so ...
Unity100


25

Ich werde die beste Antwort als empfehlen

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

Angenommen, der Benutzer hat http://example.com/?name=Hannes eingegeben

Das obige Beispiel gibt Folgendes aus:

Hallo Hannes!


4
Dies ist der schnellste und einfachste Weg, um die Variablen aus der angegebenen Abfragezeichenfolge abzurufen.
Mirko Brunner

2
Das OP fragte, wie man den Abfrageparameter von der URL erhält example.com/?Hannes...
Philipp

5

Auch wenn Sie nach dem aktuellen Dateinamen zusammen mit der Abfragezeichenfolge suchen, müssen Sie nur Folgendes tun

basename($_SERVER['REQUEST_URI'])

Es würde Ihnen Informationen wie das folgende Beispiel liefern

file.php? arg1 = val & arg2 = val

Und wenn Sie auch den vollständigen Pfad der Datei ab root haben möchten, z. B. /folder/folder2/file.php?arg1=val&arg2=val, entfernen Sie einfach die Funktion basename () und verwenden Sie einfach das Ausfüllen

$_SERVER['REQUEST_URI']

2
/ist ein gültiges Zeichen in Abfragezeichenfolgen (siehe RFC 3986 ), daher können Sie sich nicht darauf verlassen basename.
Cairnarvon

1
Dies funktioniert nicht, wenn der Querystring einen Schrägstrich enthält und daher unsicher ist. Es ist besser, den Querystring abzurufen, ihn am Ende des Anforderungs-URI zu entfernen und dann basename () auszuführen. Fügen Sie dann natürlich den Querystring am Ende hinzu.
Zenexer

4

Hier ist meine Funktion, um Teile der Abfragezeichenfolge des REFERRER neu zu erstellen .

Wenn die aufrufende Seite bereits eine Abfragezeichenfolge in ihrer eigenen URL hatte und Sie zu dieser Seite zurückkehren müssen und einige, nicht alle dieser $_GETVariablen (z. B. eine Seitenzahl) zurücksenden möchten .

Beispiel: Referrer - Abfrage - String wurde ?foo=1&bar=2&baz=3Aufruf refererQueryString( 'foo' , 'baz' )zurückkehrt 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

Dieser Code und diese Notation gehören nicht mir. Evan K löst eine mehrwertige gleichnamige Abfrage mit einer benutzerdefinierten Funktion;) wird entnommen aus:

http://php.net/manual/en/function.parse-str.php#76792 Credits gehen an Evan K.

Es ist zu erwähnen, dass das eingebaute parse_str eine Abfragezeichenfolge NICHT auf die CGI-Standardmethode verarbeitet, wenn es um doppelte Felder geht. Wenn mehrere Felder mit demselben Namen in einer Abfragezeichenfolge vorhanden sind, werden sie von jeder anderen Webverarbeitungssprache in ein Array eingelesen, aber PHP überschreibt sie stillschweigend:

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

Danke an @K. Shahzad Dies ist hilfreich, wenn Sie die neu geschriebene Abfragezeichenfolge ohne zusätzliche Ergänzungen wünschen. Angenommen, Sie schreiben / test /? X = y in index.php? Q = test & x = y um und möchten nur die Abfragezeichenfolge.

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

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

Das hat bei mir funktioniert. Ich hoffe es wird dir auch helfen :)


Ausgabe: v Parameterwert ist qnMxsGeDz90
Kamlesh

1

Um jeden Knoten in der URI explode()abzurufen , können Sie die Funktion $ _SERVER ['REQUEST_URI'] verwenden. Wenn Sie Zeichenfolgen erhalten möchten, ohne zu wissen, ob diese übergeben wurden oder nicht. Sie können die von mir selbst definierte Funktion verwenden, um Abfrageparameter von $ _REQUEST abzurufen (da dies sowohl für POST- als auch für GET-Parameter funktioniert).

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

Es kann einige Fälle geben, in denen Abfrageparameter in den Integer-Typ konvertiert werden sollen. Daher habe ich dieser Funktion den dritten Parameter hinzugefügt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.