2011-07-24 12 views
5

http://php.net/manual/en/function.mysql-real-escape-string.php:does ¿Cada llamada a mysql_real_escape_string requiere otro viaje a la base de datos?

mysql_real_escape_string() llama mysql_real_escape_string función de biblioteca de MySQL, que antepone barras invertidas a los caracteres siguientes:. \ X00 \ n \ r, \,' ", y \ X1A

Ok, así que básicamente si alguna vez hacer algo como esto:

mysql_query("insert T(C)select'".mysql_real_escape_string($value)."'")

Estoy haciendo 1 viaje a la base de datos para la función mysql_real_escape_string y otro viaje para la función mysql_query = 2 viajes a la base de datos?

Respuesta

5

El hecho de que utiliza la biblioteca mysql hace no significa que hace un viaje de ida y vuelta con el servidor.

Ejecuta el código de la biblioteca del cliente mysql, cargado en el mismo proceso que su intérprete php. Sin embargo, necesita una conexión: esa función necesita conocer algunas configuraciones del servidor para funcionar correctamente. Pero esas configuraciones se almacenan en caché en la información de conexión en el lado de PHP.

Si desea verificar esto (y estás en Linux), escribir un guión simple como:

<?php 
$link = mysql_connect('localhost', 'user', 'pass'); 
echo "Connection done\n"; 
echo mysql_real_escape_string("this ' is a test"); 
?> 

y ejecutarlo a través strace:

$ strace php t.php 
....   # here comes the connection to mysql, socket fd == 3 
connect(3, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0 
fcntl(3, F_SETFL, O_RDWR)    = 0 
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 
....   # talking with mysql here 
poll([{fd=3, events=POLLIN}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 
read(3, "8\0\0\0\n5.1.58-log\0\3\0\0\0K-?4'fL+\0\377\367!"..., 16384) = 60 
... 
read(3, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11 
       # first php echo 
write(1, "Connection done\n", 16Connection done )  = 16 
       # second php echo 
write(1, "this \\' is a test", 17this \' is a test)  = 17 
munmap(0x7f62e187a000, 528384)   = 0 
.... 

La única cosa importante que hay es que las dos write s causadas por las instrucciones echo no tienen otra llamada de syscall - no es posible la comunicación de red sin syscall (del espacio de usuario en Linux de todos modos).

+0

por qué aparece este mensaje de error al intentar usar la función mysql_real_escape_string sin conexión a ninguna base de datos: 'Acceso denegado para el usuario 'a3160679' @ 'localhost' (usando contraseña: NO) en/home/a3160679/public_html/index.php en la línea 51' – Pacerier

+1

Necesita una conexión porque lo que esa función realmente depende de algunas configuraciones del servidor (que están almacenadas en la información de conexión). – Mat

Cuestiones relacionadas