Thực tế là nó sử dụng thư viện mysql không không có nghĩa là nó thực hiện chuyến đi khứ hồi với máy chủ.
Nó chạy mã từ thư viện khách hàng mysql, được tải trong cùng một quá trình với trình thông dịch php của bạn. Tuy nhiên, bạn cần kết nối - chức năng đó cần biết một số cài đặt máy chủ để hoạt động đúng. Nhưng những cài đặt đó được lưu trữ trong thông tin kết nối ở phía PHP.
Nếu bạn muốn xác minh điều này (và bạn đang trên Linux), viết một kịch bản đơn giản như:
<?php
$link = mysql_connect('localhost', 'user', 'pass');
echo "Connection done\n";
echo mysql_real_escape_string("this ' is a test");
?>
Và chạy nó thông qua 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
....
Điều duy nhất quan trọng có là hai số write
s do các câu lệnh echo
gây ra không có syscall nào khác ở giữa - không thể kết nối mạng mà không có syscall (từ không gian người dùng trong linux anyway).
tại sao tôi nhận được thông báo lỗi này sau đó, trong khi cố gắng sử dụng hàm mysql_real_escape_string mà không cần kết nối với bất kỳ cơ sở dữ liệu nào: 'Truy cập bị từ chối cho người dùng' a3160679 '@' localhost '(sử dụng mật khẩu: NO) trong/home/a3160679/public_html/index.php trên dòng 51' – Pacerier
Bạn cần kết nối vì chức năng đó thực sự phụ thuộc vào một số cài đặt máy chủ (được lưu trữ trong thông tin kết nối). – Mat