2009-06-29 20 views
8

Paso la variable con el punto en la cadena de consulta.Php está reemplazando el punto con el puntaje bajo. Entonces, ¿cómo puedo retener el nombre de la variable que está teniendo punto en el nombredot en el nombre de la variable

http://localhost/sample.php?one.txt=on&two.txt=on

sample.php

$ ret = $ _ REQUEST [ 'uno.txt']; // No funciona

+3

No poner puntos en los nombres de variables. – Sampson

+3

¿Qué sucede si simplemente intenta integrar con OpenID, que coloca puntos en sus parámetros de consulta? – defines

Respuesta

27

La razón por la que PHP está convirtiendo su nombre de variable de one.txt en one_txt es porque los puntos no son válidos en nombres de variables.

Para más detalles, mira la PHP Documentation:

nombres de variables siguen las mismas reglas que el resto de etiquetas en PHP. Un nombre de variable válido comienza con una letra o subrayado , seguido de cualquier cantidad de letras , números o guiones bajos. Como una expresión regular , sería expresa así: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

Usted puede dar cuenta del cambio (. a _) y verificar $_REQUEST['one_txt'] o puede hacer que su formulario HTML pase un nombre de variable válido.

Editar:

Para el seguimiento en el comentario de Michael Borgwardt, aquí está el texto de PHP's documentation about handling variables from external sources:

Puntos en los nombres de variables de entrada

Típicamente, PHP no altera el nombres de variables cuando son pasadas 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 un variable llamada $ varname, seguido de el operador de concatenación de cadenas, seguido por el barestring (es decir cadena sin comillas, que doesn 't match cualquier tecla conocida o palabras reservadas) ' ext '. Obviamente, esto no tiene el resultado previsto .

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

De hecho, es algo específico de PHP.

+4

No veo cómo las reglas de PHP para identificadores son relevantes para qué nombres de claves de cadena de consulta son válidos. En todo caso, esta es una convención específica de PHP que existe debido a la función register_globals que nadie debería usar de todos modos porque es terriblemente insegura. –

+2

@Michael Borgwardt: de hecho, usted hace un punto válido. Es algo específico de PHP, probablemente un legado desde el momento en que register_globals fue el predeterminado. Y espero que nadie esté usando más :) –

6

Uso $ _SERVER [ 'QUERY_STRING']

$get = array(); 
foreach(explode('&', $_SERVER['QUERY_STRING']) as $part) 
    { 
    $part = explode('=', $part); 
    if($key = array_shift($part)) 
     { 
     $get[ $key ] = implode('', $part); 
     } 
    } 
print_r($get); 

resultado para la matriz de ejemplo ([uno.txt] => en [two.txt] => en)

+0

Works. Loco que PHP no permite params punteados. –

4

Los desarrolladores de PHP implementado esto para soportar register_globals() pero si se hubieran detenido por más de un segundo para considerar las consecuencias, entonces solo habrían alterado los nombres importados al espacio de nombres de la variable global, no en $ _POST. No hay ninguna razón para alterar las variables de solicitud ellos mismos ... bueno, aparte de hacer que PHP sea incapaz de manejar envíos de formularios estándar.

Aquí está la solución para variables POST, así, que es probablemente más difícil para los usuarios más que la solución GET:

function post_data(){  
    $data=explode('&',file_get_contents("php://input")); 
    $post=array(); 
    foreach ($data as $var){ 
     list($key,$value)=explode('=',$var,2); 
     $post[$key]=urldecode($value); 
    } 
    return $post; 
} 
Cuestiones relacionadas