2010-04-01 12 views
35

Pasé algún tiempo solucionando un problema por el cual una aplicación web PHP/MySQL tenía problemas para conectarse a la base de datos. Se podía acceder a la base de datos desde el shell y phpMyAdmin con las mismas credenciales exactas y no tenía sentido.

Resulta que la contraseña tenía un signo $ en ella:

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

La contraseña se envía era "mYPAS", que es obviamente erróneo.

¿Cuál es la mejor forma de solucionar este problema? Escapé del $ con un \

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

y funcionó.

Generalmente utilizo $string = 'test' para cadenas, que es probablemente la forma en que evité toparme con esto antes.

¿Este comportamiento es correcto? ¿Qué pasa si esta contraseña se almacenó en una base de datos y PHP la retiró? ¿Se produciría este mismo problema? ¿Qué me falta aquí ...

Respuesta

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

cadenas comilla simple no se procesan y se toman "tal cual". Siempre debe usar cadenas de comillas simples a menos que necesite específicamente las sustituciones de $ variable o secuencias de escape (\ n, \ r, etc.). Es más rápido y menos propenso a errores.

+0

Gracias por su respuesta. Parece que este es un problema de mejores prácticas. Con informes de errores estrictos, esto puede haber sido recogido más rápido. De mi pregunta original: ¿podría ser esto un problema al tomar contraseñas de la base de datos o PHP escapará del signo $? – ncatnow

+0

@ncatnow: no puede ser un problema porque las sustituciones solo se realizan en cadenas entre comillas dobles ("cadena"). Cuando lee una cadena de la base de datos, PHP la lee internamente, por lo que no está usando las cadenas entre comillas dobles para establecerla (o incluso las comillas simples). Imagine que el compilador reemplaza todas las $ cosas ** justo antes de ** establecer la variable. –

+1

Es solo un problema para cadenas escritas directamente en su código fuente, usando comillas dobles. Deben aparecer físicamente '" como $ this "' en un archivo fuente '.php'. Las cadenas de la base de datos, de un archivo, del usuario, etc. no están sujetas a interpolación. –

3

sólo hay que poner en una cadena entre comillas simples:

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

La cadena entre comillas dobles interpola las variables, pero una comilla no lo hará. Entonces eso resolverá tu problema.

3

y comillas simples

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

sólo tiene que utilizar comillas simples 'en lugar de "y no va a tratar y tratar $ palabra como una variable.

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

Cuerdas cita con el doble de presupuesto son interpretados para las variables. Individual citado cadenas se interpretan literalmente.

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

Esto debería Rendimiento:

one 
$a 
+0

¿Y qué hay de lo siguiente? $ a contiene un signo de dólar (cadena); $ b = $ a? Intenté esto, y desafortunadamente no mostró el signo de dólar. – tildy

+0

Si coloca la tarea entre comillas simples, debería aparecer. $ b = '$ a' establecerá la variable b en el texto literal '$ a'. –

+0

quiero decir $ a = 'Este libro cuesta $ 148'; $ b = '$ a' no me muestra el siguiente texto Este libro cuesta $ 148, pero si $ b = $ a, entonces intentó mostrar la variable $ 148 (?). – tildy

10

PHP es interpolatin g la variable $word en la cadena mypas$word, como es el comportamiento normal de los literales de cadena delineados con comillas dobles. Como $word es supuestamente indefinido, la cadena interpolada resultante es mypas.

La solución es utilizar comillas simples. Los literales de cadena única no se someten a interpolación variable.

3

El otro responde todo el trabajo hasta que haya comillas simples incrustadas en la contraseña.

Fail:

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

Alternativas:

Si usted no tiene otra caracteres de escape, se puede escapar el $ con \$, por ejemplo,

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

O puede ser más fácil de escapar de la comilla simple, por ejemplo,

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

+0

Genial, gracias. No sabía que podemos escapar de los personajes. – Reza

1

acabo corrió a través de este problema y lo arreglaron antes de encontrar este hilo. Estoy seguro de que todas las soluciones con comillas simples funcionan perfectamente. Elegí simplemente concatenar el pase que también funciona bien ya que no tenía conocimiento de la solución de cotización única ... IE

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
Cuestiones relacionadas