Mysql
 sql >> Database >  >> RDS >> Mysql

Ogni singola chiamata a mysql_real_escape_string richiede un altro viaggio nel database?

Il fatto che utilizzi la libreria MySQL non significa che fa un viaggio di andata e ritorno con il server.

Esegue il codice dalla libreria client mysql, caricato nello stesso processo del tuo interprete php. Tuttavia, è necessaria una connessione:quella funzione deve conoscere alcune impostazioni del server per funzionare correttamente. Ma queste impostazioni sono memorizzate nella cache delle informazioni di connessione sul lato PHP.

Se vuoi verificarlo (e sei su Linux), scrivi un semplice script come:

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

Ed eseguilo attraverso 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
....

L'unica cosa importante è che i due write è causato dall'echo le istruzioni non hanno altre syscall in mezzo - nessuna comunicazione di rete è possibile senza una syscall (dallo spazio utente in linux comunque).