2010-04-01 10 views
35

Passato qualche tempo a risolvere un problema per cui un'applicazione web PHP/MySQL aveva problemi di connessione al database. Si poteva accedere al database dalla shell e phpMyAdmin con le stesse identiche credenziali e non aveva senso.

Si scopre che la password ha avuto un $ segno in esso:

$_DB["password"] = "mypas$word"; 

La password viene inviato è stato "mypas", che è ovviamente sbagliato.

Qual è il modo migliore per gestire questo problema? Sono sfuggito a $ con un \

e ha funzionato.

Generalmente uso $string = 'test' per le stringhe che è probabilmente il modo in cui ho evitato di eseguirlo prima.

È corretto questo comportamento? Che cosa succede se questa password è stata memorizzata in un database e PHP l'ha estratta - si sarebbe verificato lo stesso problema? Che cosa mi manca qui ...

risposta

73
$_DB['password'] = 'mypas$word'; 

stringhe di citazione singoli non vengono elaborati e vengono presi "così com'è". Dovresti sempre usare le stringhe di quote singole a meno che tu non abbia specificamente bisogno delle sostituzioni $ variabili o sequenze di escape (\ n, \ r, ecc.). È più veloce e meno soggetto a errori.

+0

Grazie per la risposta. Sembra che questo sia un problema di buone pratiche. Con la segnalazione di errori severi, questo potrebbe essere stato raccolto più velocemente. Dalla mia domanda iniziale - questo potrebbe essere un problema quando prendi le password dal database, o PHP sfuggirà al segno $? – ncatnow

+0

@ncatnow: non può essere un problema perché le sostituzioni vengono eseguite solo in stringhe doppie tra virgolette ("stringa"). Quando leggi una stringa dal database viene letta internamente da PHP, quindi non stai usando le stringhe doppie tra virgolette per impostarlo (o anche le virgolette singole). Immagina che il compilatore sostituisca tutte le cose $ ** subito prima ** impostando la variabile. –

+1

È solo un problema per le stringhe scritte direttamente nel codice sorgente, usando virgolette doppie. Devono apparire fisicamente "" come $ questo "' in un file di origine '.php'. Le stringhe dal database, da un file, dall'utente, ecc. Non sono soggette a interpolazione. –

3

appena messo in una stringa tra apici singoli:

$_DB['password'] = 'mypas$word'; 

La stringa quotata tra doppi apici interpolerà variabili, ma le stringhe racchiuse tra virgolette singole non lo farà. In modo che risolva il tuo problema. apici

3

uso

$_DB["password"] = 'mypas$word'; 
2

Basta usare le virgolette singole 'invece di "e non cercherà di trattare $ parola come una variabile.

$_DB['password'] = 'mypas$word'; 
2

stringhe cita con la doppia citazione vengono interpretati per le variabili. Singolo citato stringhe vengono interpretati letteralmente.

$a = "one"; 
$b = "$a"; 
echo $b . "\n"; 
$b = '$a'; 
echo $b . "\n"; 

Questo dovrebbe resa:

one 
$a 
+0

E i seguenti? $ a contiene un segno di dollaro (stringa); $ b = $ a? Ho provato questo, e sfortunatamente non ha mostrato il simbolo del dollaro. – tildy

+0

Se si posiziona il compito tra virgolette singole, dovrebbe apparire. $ b = '$ a' imposterà la variabile b nel testo letterale '$ a'. –

+0

intendo $ a = 'Questo libro è $ 148'; $ b = '$ a' non mi ha mostrato il seguente testo Questo libro è $ 148, ma se $ b = $ a allora ha provato a mostrare la variabile $ 148 (?). – tildy

10

PHP è interpolatin g la variabile $word nella stringa mypas$word, come è normale comportamento per i letterali stringa delineati con virgolette doppie. Poiché $word è presumibilmente indefinito, la stringa interpolata risultante è mypas.

La soluzione è utilizzare le virgolette singole. I valori letterali stringa con quotatura singola non subiscono interpolazione variabile.

3

Le altre risposte funzionano tutte fino a quando non vi sono citazioni singole incorporate nella password.

Fail:

$_DB['password'] = 'my'pas$word';

Alternative:

Se non si dispone di altri personaggi fuggito, si può sfuggire al $ con \$, per esempio

$_DB['password'] = "my'pas\$word;"

O può essere più semplice per sfuggire alla sola citazione per esempio

$_DB['password'] = 'my\'pas$word;'

+0

Ottimo, grazie. Non sapevo che possiamo sfuggire ai personaggi. – Reza

1

Ho appena imbattuto in questo problema e ha risolto il tutto prima di trovare questo thread. Sono sicuro che tutte le soluzioni con le virgolette singole funzionano perfettamente. Ho scelto di concatenare semplicemente il passaggio che funziona anche bene, dato che non ero a conoscenza della singola soluzione di quota .... IE

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
Problemi correlati