2008-11-12 7 views
17

Tengo el problema de que PHP reemplaza todos los espacios con subrayados en las variables POST y GET. Por ejemplo, si tengo la URL: http://localhost/proxy.php?user name = Max , el navegador la convertirá a http://localhost/proxy.php?user%20name=Max.PHP reemplaza espacios con subrayados

Pero si me dan los parámetros $ _GET a cabo, la clave no es nombre de usuario pero nombre_usuario!

¿Hay alguna posibilidad de cambiar este comportamiento?

+1

posible duplicado de [Obtener PHP se deja de sustituir ''. caracteres en las matrices $ \ _ GET o $ \ _ POST?] (http://stackoverflow.com/questions/68651/get-php-to-stop-replacing-characters-in-get-or-post-arrays) –

Respuesta

34

Desde el PHP manual:

Puntos en los nombres de variables de entrada

Típicamente, PHP no altera las nombres de las variables cuando son pasan a un script. Sin embargo, se debe tener en cuenta que el punto (período, punto) no es un carácter válido en un nombre de variable de PHP. Por la razón, mirada en ella:

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

Ahora, lo que el intérprete ve es una variable llamada $ varname, seguido por el operador de concatenación de cadenas , seguido de la barestring (es decir, cadena sin comillas cuales no coincide con ninguna tecla conocida o palabras reservadas) 'ext'. Obviamente, este no tiene el resultado esperado.

Por esta razón, es importante tener en cuenta que PHP automáticamente reemplazar los puntos de entrada variables nombres con guiones bajos.

Y un comentario en la página:

La lista completa de los caracteres de campo de nombre que PHP convierte en _ (subrayado) es la siguiente (no sólo DOT):

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

PHP modifica de forma irreversible los nombres de campo que contienen estos caracteres en un intento de mantener la compatibilidad con la característica register_globals en desuso.

+1

Extrañamente, el editor entra en un bucle infinito si trato de hacer que el segundo párrafo sea una cita en lugar del código – Greg

+1

Por lo que recuerdo, los corchetes no se sustituyen simplemente por guion bajo, sino que permiten que varios valores se coloquen en una matriz. –

+0

Creo que significa que si tiene uno solo, por ejemplo "infierno [o". Si tienes un par coincidente, entonces estás en lo correcto, creará una matriz. – Greg

1

espacios Por lo que yo puedo recordar, nunca he visto en los nombres de parámetros URL ...

creo, sería mejor convertir todos los espacios de nombres de parámetros en "_".

+0

Tengo el mismo problema con la conversión de puntos en "_". Quería usar puntos para hacer correspondencias directas con la tabla de la base de datos con nombres de tabla de alias, por ejemplo, table_name.column_name. Como php convierte puntos en "_", la cadena se vuelve inutilizable "table_name_column_name". ¿Cómo lo resolverías? – Anatoliy

3

En los viejos locos de register_globals cadena de consulta fue descomprimida por PHP en variables globales, pero el formato de los identificadores de variable está restringido, por lo que obviamente los espacios no podrían funcionar. Esta limitación se mantuvo, y sinceramente, creo que es una buena idea mantenerlo de esta manera.

Si realmente no puede cambiar los espacios en guiones bajos en sus URL, simplemente manipule la matriz $ _GET cuando procese la solicitud y sustituya cada guión bajo por un espacio.

5

Creo que la única posibilidad de obtener los parámetros deseados, es analizar por su cuenta utilizando $_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]; 
} 
+0

notado hoy, que los parámetros de "matriz" como "foo [0] = bar" no se interpretarían como se esperaba. – Rudi

+0

correcto, pero probablemente no quiera eso de todos modos, si se esperan nombres de campo que no son nombres correctos de PHP y serán alterados por PHP incorporado en el análisis. – Guss

+0

Para una versión más concisa (y menos colateral) del analizador de cadenas de consulta de Rudi, he escrito esto: '$ query = array_reduce (array_map (function ($ part) {return array_map (function ($ kv) {return urldecode ($ kv);}, explotar ('=', $ parte, 2));} explotar ('&', $ _ SERVER ['QUERY_STRING'])), función ($ query, $ pair) {$ query [ $ pair [0]] = @ $ pair [1]; return $ query;}, []); '(es posible que desee copiar eso y formatearlo correctamente) – Guss

Cuestiones relacionadas