it-swarm.com.de

Parameter für URL-Abfragezeichenfolgen abrufen

Wie kann man mit "weniger Code" Parameter aus einer URL-Abfragezeichenfolge abrufen, 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
?>
301
enloz

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


DOKUMENTATION

503

Die PHP Methode verwendet die Funktion parse_url , 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

75
medina

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

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

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

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

Schau mal Dokumentation von parse_str


EDIT

Gemäß der Dokumentation zu PHP sollte parse_str() nur mit einem zweiten Parameter verwendet werden. Wenn Sie parse_str($_SERVER['QUERY_STRING']) für diese URL verwenden, werden die Variablen $x und $y erstellt, wodurch der Code für Angriffe wie http://www.example.com/page.php?authenticated=1 anfällig wird.

71
sbrbot

Wenn Sie die gesamte Abfragezeichenfolge möchten:

$_SERVER["QUERY_STRING"]
42

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!

23
user3816325

Auch wenn Sie den aktuellen Dateinamen zusammen mit der Abfragezeichenfolge suchen, müssen Sie nur Folgendes beachten

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 Dateipfad von root aus haben möchten, z. /folder/folder2/file.php?arg1=val&arg2=val dann entferne einfach die basename () - Funktion und verwende einfach das Füllen

$_SERVER['REQUEST_URI']
5
K. Shahzad

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

Wenn die aufrufende Seite bereits eine eigene Abfragezeichenfolge hatte URL , und Sie müssen zu dieser Seite zurückkehren und einige, nicht alle, dieser $_GET vars ( zB eine Seitenzahl).

Beispiel: Die Abfragezeichenfolge des Verweisers lautete ?foo=1&bar=2&baz=3 und ruft refererQueryString( 'foo' , 'baz' ) auf. Gibt foo=1&baz=3" zurück:

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
Adriana

Vielen Dank an @K. Shahzad Dies ist hilfreich, wenn Sie die umgeschriebene Abfragezeichenfolge ohne umgeschriebene Zusätze verwenden möchten. Angenommen, Sie schreiben/test /? X = y in index.php? Q = test & x = y 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
Sjaak Wish

Dieser Code und diese Notation gehören nicht mir. Evan K löst eine gleichnamige Mehrfachwertabfrage 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 die eingebaute parse_str KEINE Abfragezeichenfolge im CGI-Standard verarbeitet, wenn es um das Duplizieren von Feldern 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']);
?>
1
aimiliano

Um jeden Knoten in der URI abzurufen, können Sie die Funktion explode() bis $ _SERVER ['REQUEST_URI'] verwenden. Wenn Sie Zeichenketten erhalten möchten, ohne zu wissen, ob sie bestanden wurden oder nicht. Sie können die von mir 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.

1
Paul Z.