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).
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
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