2009-06-29 23 views
8

Sto passando la variabile con punto nella stringa di query.Php sta sostituendo il punto con il punteggio inferiore. Così come posso mantenere il nome della variabile che sta avendo punto nel nome dipunto nella variabile nome

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

sample.php

$ ret = $ _ richiesta [ 'one.txt']; // Non funziona

+3

Non mettere i puntini nei nomi delle variabili. – Sampson

+3

Cosa succede se si sta semplicemente tentando di integrare con OpenID, che posiziona punti nei parametri della query? – defines

risposta

27

Il motivo per cui PHP sta convertendo il nome della variabile da one.txt in one_txt è perché i punti non sono validi nei nomi di variabile.

Per ulteriori informazioni, guarda il PHP Documentation:

I nomi delle variabili seguono le stesse regole come altre etichette in PHP. Un nome di variabile valido inizia con una lettera o il carattere di sottolineatura , seguito da un numero qualsiasi di lettere , numeri o caratteri di sottolineatura. Come un'espressione regolare , sarebbe indicati con l'espressione: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

È è possibile prendere in considerazione la modifica (. a _) e verificare $_REQUEST['one_txt'] oppure è possibile rendere il modulo HTML che passa invece un nome di variabile valido.

Edit:

al follow-up al commento di Michael Borgwardt, ecco il testo da PHP's documentation about handling variables from external sources:

Dots nei nomi delle variabili in arrivo

Tipicamente, PHP non altera le nomi di variabili quando sono passati in uno script. Tuttavia, si deve notare che il punto (punto, punto) non è un carattere valido in in un nome di variabile PHP. Per la ragione, un'occhiata:

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

Ora, che il parser vede è un variabile denominata $ varname, seguito dal l'operatore di concatenazione di stringhe, seguito dal barestring (cioè stringa non quotate che doesn 't corrisponde a qualsiasi chiave nota o parole riservate) ' ext '. Ovviamente, questo non ha il risultato voluto.

Per questo motivo, è importante notare che PHP automaticamente sostituire tutti i punti in entrata variabile nomi con sottolineatura.

È davvero una cosa specifica per PHP.

+4

Non vedo come le regole di PHP per gli identificatori siano rilevanti per quanto i nomi delle chiavi stringa di query siano validi. Se non altro, questa è una convenzione specifica per PHP che esiste a causa della funzione register_globals che nessuno dovrebbe usare comunque perché è orribilmente insicura. –

+2

@Michael Borgwardt: in effetti tu fai un punto valido. È una cosa specifica per PHP, probabilmente un'eredità dal momento che register_globals era l'impostazione predefinita. E spero che nessuno stia usando più :) –

6

Usa $ _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); 

Risultato per il tuo esempio Array ([one.txt] => su [two.txt] => a)

+0

Works. Pazzo che PHP non consente parametri punteggiati. –

4

Gli sviluppatori PHP implementato per supportare register_globals() ma se fossero stati sospesi per più di un secondo per considerare le conseguenze, avrebbero solo modificato i nomi importati nello spazio dei nomi delle variabili globali, non in $ _POST stesso. Non c'è motivo di alterare le variabili di richiesta stesse ... beh, a parte il fatto di rendere PHP incapace di gestire le presentazioni di moduli standard.

Ecco la soluzione per le variabili POST pure, che è probabilmente più difficile per più utenti che la soluzione 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; 
}