Trước hết: không sử dụng mysql_escape_string
, nó không được dùng nữa (vì một lý do)!
Nếu bạn phải hỗ trợ một ứng dụng kế thừa kết nối với cơ sở dữ liệu thông qua mysql
tiện ích mở rộng ( không được dùng nữa
), sử dụng mysql_real_escape_string
thay thế. Nếu không thì chuyển đổi ngay lập tức
tới mysqli
, trong đó các câu lệnh được chuẩn bị sẵn và các tham số liên kết cung cấp một cơ chế mạnh mẽ hơn để thoát đầu vào của người dùng.
Điều đó nói rằng, câu trả lời có thể được tìm thấy bằng cách đọc mô tả của mysql_real_escape_string
và addslashes
:
Sự khác biệt số 1
addslashes
không biết bất cứ điều gì về mã hóa kết nối MySql. Nếu bạn chuyển nó một chuỗi chứa các byte đại diện cho một kiểu mã hóa khác với kiểu mã hóa được sử dụng bởi kết nối MySql, thì nó sẽ vui vẻ thoát khỏi tất cả các byte có giá trị của các ký tự '
, "
, \
và \x00
. Điều này có thể không giống với tất cả các ký tự '
, "
, \
và \x00
nếu bạn đang sử dụng mã hóa không phải là mã hóa 8 bit và UTF-8. Kết quả là chuỗi mà MySql nhận được sẽ bị hỏng.
Để kích hoạt lỗi này, hãy thử sử dụng iconv
để chuyển đổi biến của bạn thành UTF-16 và sau đó thoát khỏi nó bằng addslashes
. Xem những gì cơ sở dữ liệu của bạn nhận được.
Đây là một lý do tại sao addslashes
không nên được sử dụng để thoát.
Sự khác biệt # 2
Ngược lại với addslashes
, mysql_real_escape_string
cũng thoát khỏi các ký tự \r
, \n
và \x1a
. Có vẻ như các ký tự này cũng phải được thoát ra khi nói chuyện với MySql, nếu không, một truy vấn không đúng định dạng có thể là kết quả
Đây là lý do khác tại sao addslashes
không nên được sử dụng để thoát.