90 votes

Faire en sorte que PHP cesse de remplacer les caractères '.' dans les tableaux $_GET ou $_POST ?

Si je passe des variables PHP avec . dans leur nom via $_GET PHP les remplace automatiquement par _ personnages. Par exemple :

<?php
echo "url is ".$_SERVER['REQUEST_URI']."<p>";
echo "x.y is ".$_GET['x.y'].".<p>";
echo "x_y is ".$_GET['x_y'].".<p>";

... produit les résultats suivants :

url is /SpShipTool/php/testGetUrl.php?x.y=a.b
x.y is .
x_y is a.b.

... ma question est la suivante : existe-t-il cualquier comment je peux arrêter ça ? Je n'arrive pas à comprendre ce que j'ai fait pour mériter ça.

La version de PHP que j'utilise est 5.2.4-2ubuntu5.3.

0voto

Fernando Points 1

..

Pourquoi ne pas convertir tous les points en une sorte de jeton, comme par exemple, en (~#~) et ensuite le poster ? Lorsque vous recevez les valeurs, vous pouvez alors les reconvertir... C'est parce que parfois nous avons BESOIN de poster des underscores... et nous les perdrions en reconvertissant tous les "_" en ". "s...

0voto

ChrisNY Points 710

Eh bien, la fonction que j'inclus ci-dessous, "getRealPostArray()", n'est pas une jolie solution, mais elle gère les tableaux et supporte les deux noms : "alpha_beta" et "alpha.beta" :

  <input type='text' value='First-.' name='alpha.beta[a.b][]' /><br>
  <input type='text' value='Second-.' name='alpha.beta[a.b][]' /><br>
  <input type='text' value='First-_' name='alpha_beta[a.b][]' /><br>
  <input type='text' value='Second-_' name='alpha_beta[a.b][]' /><br>

alors que var_dump($_POST) produit :

  'alpha_beta' => 
    array (size=1)
      'a.b' => 
        array (size=4)
          0 => string 'First-.' (length=7)
          1 => string 'Second-.' (length=8)
          2 => string 'First-_' (length=7)
          3 => string 'Second-_' (length=8)

var_dump( getRealPostArray()) produit :

  'alpha.beta' => 
    array (size=1)
      'a.b' => 
        array (size=2)
          0 => string 'First-.' (length=7)
          1 => string 'Second-.' (length=8)
  'alpha_beta' => 
    array (size=1)
      'a.b' => 
        array (size=2)
          0 => string 'First-_' (length=7)
          1 => string 'Second-_' (length=8)

La fonction, pour ce qu'elle vaut :

function getRealPostArray() {
  if ($_SERVER['REQUEST_METHOD'] !== 'POST') {#Nothing to do
      return null;
  }
  $neverANamePart = '~#~'; #Any arbitrary string never expected in a 'name'
  $postdata = file_get_contents("php://input");
  $post = [];
  $rebuiltpairs = [];
  $postraws = explode('&', $postdata);
  foreach ($postraws as $postraw) { #Each is a string like: 'xxxx=yyyy'
    $keyvalpair = explode('=',$postraw);
    if (empty($keyvalpair[1])) {
      $keyvalpair[1] = '';
    }
    $pos = strpos($keyvalpair[0],'%5B');
    if ($pos !== false) {
      $str1 = substr($keyvalpair[0], 0, $pos);
      $str2 = substr($keyvalpair[0], $pos);
      $str1 = str_replace('.',$neverANamePart,$str1);
      $keyvalpair[0] = $str1.$str2;
    } else {
      $keyvalpair[0] = str_replace('.',$neverANamePart,$keyvalpair[0]);
    }
    $rebuiltpair = implode('=',$keyvalpair);
    $rebuiltpairs[]=$rebuiltpair;
  }
  $rebuiltpostdata = implode('&',$rebuiltpairs);
  parse_str($rebuiltpostdata, $post);
  $fixedpost = [];
  foreach ($post as $key => $val) {
    $fixedpost[str_replace($neverANamePart,'.',$key)] = $val;
  }
  return $fixedpost;
}

0voto

John Points 1413

En utilisant les crb's, j'ai voulu recréer les $_POST dans son ensemble, mais n'oubliez pas que vous devrez toujours vous assurer que l'encodage et le décodage sont corrects, tant au niveau du client que du serveur. Il est important de comprendre quand un caractère est vraiment invalide et c'est vraiment valide . En outre, les gens devraient toujours y toujours échapper les données du client avant de les utiliser avec cualquier commande de base de données sans exception .

<?php
unset($_POST);
$_POST = array();
$p0 = explode('&',file_get_contents('php://input'));
foreach ($p0 as $key => $value)
{
 $p1 = explode('=',$value);
 $_POST[$p1[0]] = $p1[1];
 //OR...
 //$_POST[urldecode($p1[0])] = urldecode($p1[1]);
}
print_r($_POST);
?>

Je recommande de ne l'utiliser que dans des cas particuliers. A priori, je ne suis pas sûr des points négatifs à mettre au début de votre fichier d'en-tête principal.

0voto

sasha-ch Points 1

Ma solution actuelle (basée sur les réponses du sujet précédent) :

function parseQueryString($data)
{
    $data = rawurldecode($data);   
    $pattern = '/(?:^|(?<=&))[^=&\[]*[^=&\[]*/';       
    $data = preg_replace_callback($pattern, function ($match){
        return bin2hex(urldecode($match[0]));
    }, $data);
    parse_str($data, $values);

    return array_combine(array_map('hex2bin', array_keys($values)), $values);
}

$_GET = parseQueryString($_SERVER['QUERY_STRING']);

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