http://php.net/manual/en/function.mysql-real-escape-string.php:
mysql_real_escape_string()调用MySQL的库函数 mysql_real_escape_string,它将反斜杠添加到以下内容 字符:\ x00,\ n,\ r,\,',“和\ x1a。
好的,基本上如果我做过这样的事情:
mysql_query("insert T(C)select'".mysql_real_escape_string($value)."'")
我正在为mysql_real_escape_string函数进行一次数据库访问,另一次访问函数mysql_query = 2次访问数据库?
答案 0 :(得分:5)
它使用mysql库的事实不意味着它与服务器进行往返。
它从mysql客户端库运行代码,在与php解释器相同的进程中加载。您确实需要连接 - 该功能需要知道某些服务器设置才能正常运行。但这些设置缓存在PHP端的连接信息中。
如果您想验证这一点(并且您使用的是Linux),请编写一个简单的脚本,如:
<?php
$link = mysql_connect('localhost', 'user', 'pass');
echo "Connection done\n";
echo mysql_real_escape_string("this ' is a test");
?>
并通过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
....
唯一重要的是由write
语句引起的两个echo
之间没有其他系统调用 - 如果没有系统调用(无论如何来自linux中的用户空间),都不可能进行网络通信。