web-dev-qa-db-fra.com

Obtenir les paramètres de chaîne de requête d'URL

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

www.monsite.com/catégorie/sous-catégorie?myqueryhash

La sortie devrait être: myqueryhash

Je suis conscient de cette approche:

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

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

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


DOCUMENTATION

503

La manière de le faire PHP consiste à 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

75
medina

La fonction parse_str() lit automatiquement tous les paramètres de la 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 les paramètres dans le tableau $queries ($queries['x']=100, $queries['y']=200).

Regardez documentation de parse_str


EDIT

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

71
sbrbot

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

$_SERVER["QUERY_STRING"]
42

Je recommanderai la meilleure réponse en tant que

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

En supposant que l'utilisateur ait entré http://example.com/?name=Hannes

L'exemple ci-dessus affichera:

Bonjour Hannes!

23
user3816325

Aussi, si vous recherchez le nom du fichier actuel avec la chaîne de requête, il vous suffira de suivre

basename($_SERVER['REQUEST_URI'])

Il vous fournirait des informations comme l'exemple suivant

fichier.php? arg1 = val & arg2 = val

Et si vous voulez aussi le chemin complet du fichier à partir de la racine, par exemple. /folder/folder2/file.php?arg1=val&arg2=val puis supprimez simplement la fonction basename () et utilisez simplement le remplissage

$_SERVER['REQUEST_URI']
5
K. Shahzad

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

Si la page appelante avait déjà une chaîne de requête dans son propre URL , et vous devez revenir à cette page et vouloir renvoyer une partie, pas la totalité, de cette $_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' ) renvoie 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
Adriana

Merci à @K. Shahzad Cela aide lorsque vous souhaitez que la chaîne de requête réécrite soit sans ajouts de réécriture. Supposons que vous réécriviez le fichier/test /? X = y en index.php? Q = test & x = y et que vous ne vouliez que 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();
2
Sjaak Wish

Ce code et cette notation ne m'appartiennent pas. Evan K résout une requête de même nom portant sur plusieurs valeurs avec une fonction personnalisée;) provient de:

http://php.net/manual/en/function.parse-str.php#76792 Crédits vont à Evan K.

Il est à noter que la commande intégrée parse_str NE traite PAS une chaîne de requête de la manière standard CGI, lorsqu'il s'agit de dupliquer des champs. Si plusieurs champs du même nom existent dans une chaîne de requête, tous les autres langages de traitement Web les liront dans un tableau, mais PHP les écrase de manière silencieuse:

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

Pour obtenir chaque nœud dans l'URI, vous pouvez utiliser la fonction explode() vers $ _SERVER ['REQUEST_URI']. Si vous voulez obtenir des chaînes sans savoir si c'est passé ou pas. vous pouvez utiliser la fonction que j'ai moi-même définie pour obtenir les paramètres de requête de $ _REQUEST (car cela fonctionne à la fois pour les paramètres POST et 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;
}

Il peut arriver que nous voulions convertir les paramètres de requête en type Integer. J'ai donc ajouté le troisième paramètre à cette fonction.

1
Paul Z.