Mysql
 sql >> Base de données >  >> RDS >> Mysql

Chaque appel à mysql_real_escape_string nécessite-t-il un autre voyage vers la base de données ?

Le fait qu'il utilise la bibliothèque mysql ne le fait pas signifie qu'il fait un aller-retour avec le serveur.

Il exécute le code de la bibliothèque client mysql, chargé dans le même processus que votre interpréteur php. Vous avez cependant besoin d'une connexion - cette fonction doit connaître certains paramètres du serveur pour fonctionner correctement. Mais ces paramètres sont mis en cache dans les informations de connexion côté PHP.

Si vous voulez vérifier cela (et que vous êtes sous Linux), écrivez un script simple comme :

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

Et exécutez-le via 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 seule chose importante est que les deux write s causé par le echo les instructions n'ont pas d'autre appel système entre les deux - aucune communication réseau n'est possible sans un appel système (depuis l'espace utilisateur sous Linux de toute façon).