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

322

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

www.mysite.com/category/subcategory?myqueryhash

La sortie doit être: myqueryhash

Je connais cette approche:

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

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

Réponses:

527

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


DOCUMENTATION

Filip Roséen - refp
la source
28
print_r ($ _ SERVER) pour trouver les valeurs associées
22
note: $_SERVER['QUERY_STRING']s'affichera foo=bar2pour la chaîne de requête commefoo=bar1&foo=bar2
Timo Huovinen
3
Pour obtenir une sortie plus lisible, vous pouvez envelopper la print_r()déclaration dans les <pre>balises: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali
1
@RJAnoop Dans ce cas, qstring fait partie de l'URL, vous pouvez donc l'utiliser $_SERVER['REQUEST_URI'], même si vous pouvez envisager d'utiliser mod_rewrite pour passer cette partie de l'URL en tant que variable. Voir stackoverflow.com/questions/16388959/url-rewriting-with-php
nullabilité
5
Alors pourquoi est-ce mieux que d'utiliser $ _GET?
still_dreaming_1
92

La façon PHP de le faire est d'utiliser la fonction parse_url , qui analyse une URL et retourne 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

médina
la source
15
C'est en fait la meilleure réponse basée sur la question. Les autres réponses n'obtiennent que l' URI actuel tandis que la question spécifie uniquement "à partir de l'URL".
Chris Harrison
80

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 les paramètres dans le $queriestableau ( $queries['x']=100, $queries['y']=200).

Regardez la documentation de parse_str


ÉDITER

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

sbrbot
la source
52
..et est une fonction mauvaise, mauvaise qui ne devrait pas exister.
Zenexer
6
Zenexer pouvez-vous élaborer un peu plus votre déclaration? POURQUOI C'EST UN MAL?
sbrbot
26
Vous ne devez jamais transformer aveuglément des paramètres de chaîne de requête en variables. Que pensez-vous qu'il se passe si quelqu'un utilise une clé qui correspond à une variable réelle? C'est demander des exploits. C'est pourquoi cette fonctionnalité est fortement déconseillée. Vous pouvez configurer PHP pour qu'il le fasse automatiquement, sans appeler parse_str, mais naturellement, c'est considéré comme un non-non.
Zenexer
42
Vous pouvez utiliser le deuxième paramètre de parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- maintenant le $paramstableau contiendra toutes les valeurs de la chaîne de requête.
Amal Murali
13
"Vous ne devez jamais transformer aveuglément des paramètres de chaîne de requête en variables" De telles déclarations sont totalement absurdes. "Jamais" -> comment savez-vous quel genre de situations un codeur donné connaîtra à une heure aléatoire d'une journée de travail aléatoire ........ Un non-sens absolu. Il n'y a pas de mot comme «jamais». TOUT est dangereux lorsque vous l'utilisez mal, TOUT est utile lorsque vous l'utilisez correctement ... Il y a 10 ans, beaucoup de gens parlaient comme ça à propos des IFRAME. mal, stupidité absolue. risque de sécurité absolu. puis vint facebook, puis vint social, iframes partout et personne ne parle comme ça maintenant ....
Unity100
42

Si vous voulez la chaîne de requête entière:

$_SERVER["QUERY_STRING"]
Jason T Featheringham
la source
25

Je recommanderai la meilleure réponse comme

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

En supposant que l'utilisateur a saisi http://example.com/?name=Hannes

L'exemple ci-dessus affichera:

Bonjour Hannes!

user3816325
la source
4
C'est le moyen le plus rapide et le plus simple d'obtenir les variables à partir de la chaîne de requête donnée.
Mirko Brunner le
2
L'OP a demandé comment obtenir le paramètre de requête à partir de l'URL example.com/?Hannes...
Philipp
5

De plus, si vous recherchez le nom de fichier actuel avec la chaîne de requête, vous aurez juste besoin de suivre

basename($_SERVER['REQUEST_URI'])

Il vous fournirait des informations comme l'exemple suivant

file.php? arg1 = val & arg2 = val

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

$_SERVER['REQUEST_URI']
K. Shahzad
la source
2
/est un caractère valide dans les chaînes de requête (voir RFC 3986 ), vous ne pouvez donc pas vous y fier basename.
Cairnarvon
1
Cela ne fonctionnera pas si la chaîne de requête contient une barre oblique et n'est donc pas sécurisée. Il vaut mieux obtenir la chaîne de requête, la supprimer de la fin de l'URI de la demande, puis exécuter basename () - puis, bien sûr, ajouter la chaîne de requête à la fin.
Zenexer
4

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

Si la page appelante avait déjà une chaîne de requête dans sa propre URL , et vous devez revenir à cette page et vouloir renvoyer certains, pas tous, de ces $_GETvars (par exemple un numéro de page).

Exemple: la chaîne de requête du référent ?foo=1&bar=2&baz=3appelait des refererQueryString( 'foo' , 'baz' )retours 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'));
Adriana
la source
4

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

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

Il convient de mentionner que la fonction 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 liraient dans un tableau, mais PHP les écrase 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']);
?>
aimiliano
la source
3

Merci à @K. Shahzad Cela vous aide lorsque vous souhaitez réécrire la chaîne de requête sans ajout de réécriture. Supposons que vous réécrivez / test /? X = y dans index.php? Q = test & x = y et que vous ne souhaitiez 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();
Souhait Sjaak
la source
2

Langage de programmation: 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'];

Cela a fonctionné pour moi. J'espère que cela vous aidera aussi :)

Kamlesh
la source
Sortie: la valeur du paramètre v est qnMxsGeDz90
Kamlesh
1

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

Dans certains cas, nous souhaitons convertir les paramètres de requête en type Integer, j'ai donc ajouté le troisième paramètre à cette fonction.

Paul Z.
la source