2010-04-01 15 views
35

Habe einige Zeit damit verbracht, ein Problem zu lösen, bei dem eine PHP/MySQL-Webanwendung Probleme hatte, sich mit der Datenbank zu verbinden. Auf die Datenbank kann von der Shell und von phpMyAdmin mit genau denselben Zugangsdaten zugegriffen werden, und es ergab keinen Sinn.

Stellt sich heraus, das Passwort in eine $ -Zeichen hatte:

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

Das Passwort „mypas“ war gesendet werden, die offensichtlich falsch ist.

Was ist der beste Weg, um mit diesem Problem umzugehen? Ich entkam der $ mit einem \

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

und es funktionierte.

Normalerweise verwende ich $string = 'test' für Strings, was wahrscheinlich ist, wie ich es vermieden habe, davor zu laufen.

Ist das korrektes Verhalten? Was wäre, wenn dieses Passwort in einer Datenbank gespeichert wäre und PHP es herausgezogen hätte - würde das gleiche Problem auftreten? Was bin ich hier ...

Antwort

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

Einzel Zitat Strings werden nicht verarbeitet und getroffen werden, "wie sie ist". Sie sollten immer einfache Anführungszeichenfolgen verwenden, es sei denn, Sie benötigen speziell die Ersetzungen für $ -Variablen oder Escape-Sequenzen (\ n, \ r usw.). Es ist schneller und weniger fehleranfällig.

+0

Danke für Ihre Antwort. Es scheint, dass dies ein Problem der Best Practice ist. Mit strikter Fehlerberichterstattung könnte dies schneller aufgenommen worden sein. Von meiner ursprünglichen Frage - könnte dies ein Problem sein, wenn Passwörter aus der Datenbank abgerufen werden, oder wird PHP das $ -Zeichen umgehen? – ncatnow

+0

@ncatnow: Es kann kein Problem sein, da die Ersetzungen nur in doppelt zitierten Strings ("string") durchgeführt werden. Wenn Sie eine Zeichenfolge aus der Datenbank lesen, wird sie intern von PHP gelesen, so dass Sie nicht die doppelt zitierten Strings verwenden, um sie zu setzen (oder sogar die einfachen Anführungszeichen). Stellen Sie sich vor, der Compiler würde alle $ stuff ** ersetzen, bevor Sie die Variable setzen. –

+1

Es ist nur ein Problem für Zeichenfolgen, die direkt in Ihrem Quelltext geschrieben werden, indem doppelte Anführungszeichen verwendet werden. Sie müssen physikalisch "" wie $ this "' in einer '.php' Quelldatei erscheinen. Strings aus der Datenbank, aus einer Datei, aus dem Benutzer usw. werden nicht interpoliert. –

3

Setzen Sie ihn einfach in einem einzigen String in Anführungszeichen:

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

Die Strings in doppelten Anführungszeichen Variablen interpoliert werden, aber einfache Anführungszeichen nicht. Das wird dein Problem lösen.

3

Verwendung Apostrophe

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

Nur einfache Anführungszeichen 'statt "verwenden und es wird nicht versuchen und $ Wort als Variable zu behandeln.

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

Strings zitiert mit dem doppelten Anführungszeichen wird für Variablen interpretiert. Einzelne Anführungszeichen buchstäblich interpretiert werden.

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

Dies sollte Ausbeute:

one 
$a 
+0

Und was ist mit den folgenden? $ a enthält ein Dollarzeichen (String); $ b = $ a? Ich habe das versucht, und leider hat es das Dollarzeichen nicht gezeigt. – tildy

+0

Wenn Sie die Zuweisung in einfache Anführungszeichen setzen, sollte sie angezeigt werden. $ b = '$ a' setzt die Variable b auf den Literaltext '$ a'. –

+0

Ich meine $ a = 'Dieses Buch ist $ 148'; $ b = '$ a' zeigt mir nicht den folgenden Text Dieses Buch ist $ 148, aber wenn $ b = $ a dann versuchte es, die $ 148 (?) Variable anzuzeigen. – tildy

10

PHP ist interpolatin g die Variable $word in die Zeichenkette mypas$word, wie es bei String-Literalen üblich ist, die in Anführungszeichen gesetzt sind. Da $word vermutlich nicht definiert ist, lautet die resultierende interpolierte Zeichenfolge mypas.

Die Lösung besteht darin, einfache Anführungszeichen zu verwenden. String-Literale mit einem einzigen Anführungszeichen unterliegen keiner variablen Interpolation.

3

Die anderen Antworten funktionieren alle, bis einzelne Anführungszeichen im Password eingebettet sind.

Fail:

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

Alternativen:

Wenn Sie keine anderen Zeichen entgangen haben, können Sie die $ mit \$ entkommen, z.B.

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

Oder es kann einfacher sein, den Apostroph zu entkommen z.B.

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

+0

Großartig, danke. Ich wusste nicht, dass wir Zeichen entkommen können. – Reza

1

Ich lief über dieses Problem und es behoben, bevor dieses Thema zu finden. Ich bin mir sicher, dass alle Lösungen mit einfachen Anführungszeichen perfekt funktionieren. Ich wählte, um den Durchlauf gerade zu verketten, der auch gut funktioniert, da ich die einfache Anführungsstrichlösung nicht kannte .... IE