Obtenir la chaîne de requête D'URL

Quelle est la manière" moins de code nécessaire " pour obtenir les paramètres d'une chaîne de requête URL formatée comme suit?

www.mysite.com/category/subcategory?myqueryhash

sortie: myqueryhash

je suis conscient de cette approche:

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
270
demandé sur Peter Mortensen 2011-12-12 07:56:02

10 réponses

$_SERVER['QUERY_STRING'] contient les données que vous recherchez.


DOCUMENTATION

469
répondu Filip Roséen - refp 2014-05-09 08:59:51

la façon PHP de le faire est d'utiliser la fonction parse_url , qui analyse une URL et renvoie ses composants. Y compris la chaîne de requête.

exemple:

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

documentation complète ici

63
répondu medina 2017-02-08 22:25:10

la fonction parse_str() lit automatiquement tous les paramètres de requête dans un tableau.

par exemple, si L'URL est http://www.example.com/page.php?x=100&y=200 , le code

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

stockera" x "= 100 et " y "= 200 dans $queries .

Regardez documentation de parse_str


modifier

selon la La documentation PHP, parse_str() ne doit être utilisée qu'avec un second paramètre. L'utilisation de parse_str($_SERVER['QUERY_STRING']) sur cette URL créera des variables $x et $y , ce qui rend le code vulnérable à des attaques telles que http://www.example.com/page.php?authenticated=1 .

52
répondu sbrbot 2018-03-09 07:56:57

si vous voulez toute la chaîne de requête:

$_SERVER["QUERY_STRING"]
39
répondu Jason T Featheringham 2011-12-12 03:58:42

je recommanderai la meilleure réponse comme

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

en supposant que l'Utilisateur a entré http://example.com/?name=Hannes

l'exemple ci-dessus affichera:

Hello Hannes!

21
répondu user3816325 2015-01-19 16:49:33

aussi si vous cherchez le nom de fichier actuel avec la chaîne de requête, vous aurez juste besoin de la suite

basename($_SERVER['REQUEST_URI'])

il vous fournirait des informations comme l'exemple suivant""

"151920920 de fichier".le php?arg1 = val&arg2 =val

et si vous voulez aussi le chemin complet du fichier aussi bien à partir de la racine, par exemple /folder/folder2/file.le php?arg1=val&arg2=val puis il suffit de supprimer la fonction basename() et d'utiliser le remplissage

$_SERVER['REQUEST_URI']
4
répondu K. Shahzad 2013-10-02 08:44:25

voici ma fonction pour reconstruire des parties de la chaîne de requête REFERRER's .

si la page d'appel avait déjà une chaîne de requête dans son propre URL , et que vous devez retourner à cette page et que vous voulez renvoyer certains, pas tous, de ces $_GET vars (par exemple un numéro de page).

exemple: la chaîne de requête du référent était ?foo=1&bar=2&baz=3 appelant refererQueryString( 'foo' , 'baz' ) retourne 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'));
3
répondu Adriana 2014-04-10 19:58:13

pour obtenir chaque noeud dans L'URI, vous pouvez utiliser la fonction explode() à $_SERVER['REQUEST_URI']. Si vous voulez obtenir des cordes sans savoir si elle est passée ou non. vous pouvez utiliser la fonction que j'ai moi-même définie pour obtenir les paramètres de requête à partir de $_REQUEST (car cela fonctionne à la fois pour POST et GET params).

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

il peut y avoir des cas où nous voulons convertir des paramètres de requête en type entier, donc j'ai ajouté le troisième paramètre à cette fonction.

1
répondu Paul Z. 2014-12-09 13:51:33

ce code et cette notation ne sont pas les miens. Evan K résout une requête multi valeurs même nom avec une fonction personnalisée ;) est tiré de:

http://php.net/manual/en/function.parse-str.php#76792 générique pour Evan K.

il convient de mentionner que le builtin parse_str ne traite pas une chaîne de requête de la manière standard de CGI, lorsqu'il s'agit de dupliquer des champs. Si plusieurs champs du même nom existe dans une chaîne de requête, tout autre langage de traitement web les lirait dans un tableau, mais PHP les écrira silencieusement:

<?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
répondu aimiliano 2016-02-08 23:17:03

merci à @K. Shahzad Cela aide quand vous voulez la chaîne de requête réécrite sans aucun ajout de réécriture. Disons que vous réécrivez le / test/?x=Y à indexer.le php?q=test & x=y et vous voulez seulement la chaîne de requête.

function get_query_string(){

    $arr = explode("?",$_SERVER['REQUEST_URI']);
    if (count($arr) == 2){
        return "";
    }else{
        return "?".end($arr)."<br>";
    }       
}
$query_string = get_query_string();
1
répondu Sjaak Wish 2017-01-25 14:41:24