19 votes

PHP remplace les espaces par des traits de soulignement

Le problème est que PHP remplace tous les espaces par des traits de soulignement dans les variables POST et GET.

Par exemple, si j'ai l'URL : http://localhost/proxy.php?user name=Max le navigateur le convertira en http://localhost/proxy.php?user%20name=Max .

Mais si je donne les paramètres $_GET, la clé n'est pas user name mais user_name (notez le trait de soulignement) !

Est-il possible de modifier ce comportement ?

35voto

Greg Points 132247

A partir de la Manuel PHP :

Points dans les noms des variables entrantes

En règle générale, PHP d nom des variables lorsqu'elles sont passées passées dans un script. Cependant, il noter que le point (point, point) n'est pas un caractère valide dans dans un nom de variable PHP. En voici la raison, regardez-la :

<?php $varname.ext;  /* invalid variable name */ ?>

N l'analyseur syntaxique voit une variable nommée $varname, suivie de l'opérateur de concaténation de chaînes de caractères suivi de l'opérateur de concaténation la chaîne de caractères (c.-à-d. la chaîne de caractères sans guillemets) qui ne correspond à aucune clé connue ni à aucun mots réservés) "ext". Évidemment, cela n'a pas le résultat escompté.

Pour cette raison, il est noter que PHP remplacera automatiquement remplacer les points dans les noms de variables par des traits de soulignement.

Et un commentaire sur la page :

La liste complète des caractères de noms de champs que PHP convertit en _ (underscore) est la suivante (pas seulement le point) :

chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP modifie de manière irréversible les noms de champs contenant ces caractères afin de maintenir la compatibilité avec la fonctionnalité register_globals, qui est obsolète.

5voto

Rudi Points 21

Je pense que la seule possibilité d'obtenir les paramètres souhaités est de les analyser soi-même en utilisant $_SERVER['QUERY_STRING'] :

$a_pairs = explode('&', $_SERVER['QUERY_STRING']);
foreach($a_pairs AS $s_pair){
  $a_pair = explode('=', $s_pair);
  if(count($a_pair) == 1) $a_pair[1] = '';

  $a_pair[0] = urldecode($a_pair[0]);
  $a_pair[1] = urldecode($a_pair[1]);

  $GLOBALS['_GET'][$a_pair[0]] = $a_pair[1];
  $_GET[$a_pair[0]] = $a_pair[1];
}

3voto

Adam Byrtek Points 5791

A l'époque de register_globals, la chaîne de requête était décompressée par PHP en variables globales, mais le format des identifiants de variables est contraint, donc les espaces ne peuvent évidemment pas fonctionner. Cette limitation est restée, et honnêtement je pense que c'est une bonne idée de la conserver.

Si vous ne pouvez vraiment pas remplacer les espaces par des traits de soulignement dans vos URL, modifiez simplement le tableau $_GET lorsque vous traitez la requête et remplacez chaque trait de soulignement par un espace.

1voto

Fred Points 2016

Pour autant que je me souvienne, je n'ai jamais vu d'espaces dans les noms de paramètres d'URL...

Je pense qu'il serait préférable de convertir tous les espaces des noms de paramètres en "_".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X