2010-09-18 9 views
24

Básicamente el título dice que es todo. que tenía una entrada oculta en mi página donde quería establecer el nombre de "some.major.uber.setting"

por ejemplo: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

y cuando miraba a los datos $ _POST Contenía " some_major_uber_setting ". ¿Alguien puede explicar este comportamiento?

+1

Para que quede claro, yo he puesto en Off register_global – Gabriel

+0

Por eso dije que es un relicto. El núcleo php reemplaza los puntos con guiones bajos por defecto. Ese comportamiento debe haberse introducido con register_globals y no se lo tocó después de eliminarlo (o al menos deshabilitarlo de manera predeterminada). – halfdan

Respuesta

22

Probablemente es una reliquia de register_global = On times. $ _GET/$ _ Las variables POST se convirtieron en variables estándar ($ _GET ['foo'] se convirtió en $ foo). Los nombres de las variables no pueden contener puntos, por lo que se convirtieron internamente.

7

Su documentados en php.net como:

puntos y espacios en los nombres de variables se convierten en caracteres de subrayado.

+5

El OP lo sabe, se afirma como parte de la pregunta, que es "¿Por qué?" – Quentin

11

Esto ha estado allí desde el original commit to CVS, hace más de 10 años.

Tiene un comentario:

/* garantizar que no tienen espacios o puntos en el nombre de la variable (no segura binario) */

no tengo ni idea de por qué no es "binario seguro" ... Tendría que preguntarle a Zeev.

enlace actual: https://github.com/php/php-src/blob/master/main/php_variables.c#L93

+0

http://en.wikipedia.org/wiki/Binary_safe –

+1

¿Por qué no? '.' es un operador PHP. –

0

Como se mencionó en mi otra respuesta, esta es la función que corrige este comportamiento lamentable.

function fix(&$target, $source, $discard = true) { 
    if ($discard) 
     $target = array(); 

    $source = preg_replace_callback(
     '/(^|(?<=&))[^=[&]+/', 
     function($key) { return bin2hex(urldecode($key[0])); }, 
     $source 
    ); 

    parse_str($source, $post); 
    foreach($post as $key => $val) 
     $target[ hex2bin($key) ] = $val; 
} 

Y a continuación, puede llamar a esta función como esta:

fix($_POST, file_get_contents('php://input')); 
Cuestiones relacionadas