Salut à tous,

Je viens de tomber sur un truc un peu chelou et je me demandais si c'était normal. J'ai beau chercher sur google, les recherches avec "point" ou "underscore" ne sont pas facile.


<form name='formulaire' action='' method='post'>
<input name='truc.tralala' value='ok' />
<input type='button' value='OK' onclick='document.formulaire.submit();' />
</form>

Si je fais un print_r($_POST); après la validation de se formulaire j'obtiens


Array([truc_tralala] =>ok)


Du coup... Ou est passé mon point ? Disparu ? Transformé ? Pourquoi donc ?

Merci d'avance Smiley smile
Modifié par ffwrude (09 Apr 2014 - 16:42)
JE constate le même comportement avec IE9 et firefox 27, que le formulaire soit soumis normalement ou via js.

Plus intéressant: en essayant en GET, on peut voir que l'URL contient toujours les points alors que les clés de $_GET ont des underscores, peu importe le navigateur et le mode de soumission.

Encore plus rigolo: en essayant avec un nom comme "array[some.key]", le point est conservé intact en GET comme en POST.

J'en déduis donc que c'est un comportement normal de php.
Après tout, le point est un opérateur !
Salut Quentin,

J'ai un collègue qui vient tout juste de m'envoyer la réponse. C'est effectivement a cause de la possibilité que ce soit un opérateur.

http://www.php.net/manual/en/language.variables.external.php

Dots in incoming variable names¶Typically, PHP does not alter the names of variables when they are passed into a script. However, it should be noted that the dot (period, full stop) is not a valid character in a PHP variable name. For the reason, look at it:

<?php
$varname.ext; /* invalid variable name */
?>
Now, what the parser sees is a variable named $varname, followed by the string concatenation operator, followed by the barestring (i.e. unquoted string which doesn't match any known key or reserved words) 'ext'. Obviously, this doesn't have the intended result.

For this reason, it is important to note that PHP will automatically replace any dots in incoming variable names with underscores.
Merci pour l'explication.

Ce qui est marrant, c'est que le point est visiblement le seul caractère qui est transformé. = < > * % + - / ~ $ # passent tous; or je ne pense pas qu'ils soient tous interdits / invalides du point de vue W3C (le tiret par exemple)

En plus ce n'est pas absolument impossible d'avoir un nom de variable avec un point, même si c'est capilotracté pour y accéder :
${'truc.bidule'} = 1; // fonctionne!
D'autant plus que REGISTER_GLOBALS est déprécié depuis belle lurette et qu'on accède donc en principe aux données avec $_GET ou $_POST (aucun problème pour accéder à $_POST['some.key']).

Bref, c'est rigolo les vestiges de php3 parfois...
Oui assez parce que comme tu l'as dit tu peux tres bien créer une variable $_POST["truc.tralala"] = "machin";