2011-07-24 20 views
5

http://php.net/manual/en/function.mysql-real-escape-string.php:Mọi cuộc gọi đơn lẻ tới mysql_real_escape_string có yêu cầu một chuyến đi khác đến cơ sở dữ liệu không?

mysql_real_escape_string() gọi MySQL của chức năng thư viện mysql_real_escape_string, mà prepends backslashes đến ký tự sau:. \ X00 \ n, \ r, \,', "và \ x1a

Ok, vì vậy về cơ bản nếu tôi bao giờ làm điều gì đó như thế này:

mysql_query("insert T(C)select'".mysql_real_escape_string($value)."'")

Tôi đang thực hiện 1 chuyến đi tới cơ sở dữ liệu cho hàm mysql_real_escape_string và một chuyến đi khác cho hàm mysql_query = 2 chuyến đi tới cơ sở dữ liệu?

Trả lời

5

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

+0

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

+1

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

Các vấn đề liên quan