377 Stimmen

URL-Abfrage-String-Parameter abrufen

Was ist die "weniger Code benötigt" Weg, um Parameter aus einer URL-Abfragezeichenfolge zu erhalten, die wie folgt formatiert ist?

www.mysite.com/category/subcategory?myqueryhash

Die Ausgabe sollte sein: myqueryhash

Ich bin mir dieses Ansatzes bewusst:

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

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

10voto

Kamlesh Punkte 3690

Programmiersprache: PHP

// Inintialize a 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 the parse_str() function to parse the 
// string passed via the URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is ' . $params['v'];

Das hat bei mir funktioniert.

9voto

aimiliano Punkte 1018

Dieser Code und die Notation sind nicht von mir. Evan K löst eine Abfrage mit mehreren Werten und gleichem Namen mit einer eigenen Funktion ;) ist entnommen aus:

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

Es ist zu erwähnen, dass die parse_str builtin verarbeitet einen Query-String NICHT auf die CGI-Standardweise, wenn es um doppelte Felder geht. Wenn mehrere gleichnamige Felder in einem Query-String vorhanden sind, würde jede andere Webverarbeitungssprache sie in ein Array einlesen, 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');
?>

Stattdessen verwendet PHP eine nicht standardkonforme Praxis, indem es Klammern in Feldnamen einfügt, um den gleichen Effekt zu erzielen.

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

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

Dies kann für alle, die an den CGI-Standard gewöhnt sind, verwirrend sein, daher sollten Sie dies im Hinterkopf behalten. Als Alternative verwende ich eine "richtige" Querystring-Parser-Funktion:

<?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']);
?>

7voto

K. Shahzad Punkte 87

Auch wenn Sie nach dem aktuellen Dateinamen zusammen mit dem Abfrage-String suchen, brauchen Sie nur folgendes

basename($_SERVER['REQUEST_URI'])

Es würde Ihnen Informationen wie das folgende Beispiel liefern

datei.php?arg1=val&arg2=val

Und wenn Sie auch vollen Pfad der Datei als auch beginnend von Root, z. B. /Ordner/Ordner2/Datei.php?arg1=val&arg2=val dann einfach entfernen basename() Funktion und verwenden Sie nur fillowing

$_SERVER['REQUEST_URI']

4voto

Adriana Punkte 91

Hier ist meine Funktion zum Wiederaufbau von Teilen der REFERRER's Abfragezeichenfolge.

Wenn die aufrufende Seite bereits einen Query-String in ihrer eigenen URL und Sie müssen zu dieser Seite zurückkehren und einen Teil, nicht alles, zurückschicken. $_GET vars (z.B. eine Seitenzahl).

Beispiel: Der Query-String des Referrers war ?foo=1&bar=2&baz=3 aufrufen refererQueryString( 'foo' , 'baz' ) gibt zurück. 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'));

4voto

Sjaak Wish Punkte 325

Dank an @K. Shahzad.

Dies ist hilfreich, wenn Sie die umgeschriebene Abfragezeichenfolge ohne Umschreibungszusätze wünschen. Angenommen, Sie schreiben /test/?x=y in index.php?q=test&x=y um und wollen nur den Abfrage-String.

function get_query_string(){

    $arr = explode("?", $_SERVER['REQUEST_URI']);
    if (count($arr) == 2){
        return "";
    }
    else{
        return "?" . end($arr) . "<br>";
    }
}
$query_string = get_query_string();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X