Thoát khỏi một chuỗi có nghĩa là giảm sự mơ hồ trong dấu ngoặc kép (và các ký tự khác) được sử dụng trong chuỗi đó. Ví dụ: khi bạn xác định một chuỗi, bạn thường đặt nó trong dấu ngoặc kép hoặc dấu ngoặc đơn:
"Hello World."
Nhưng điều gì sẽ xảy ra nếu chuỗi của tôi có dấu ngoặc kép bên trong nó?
"Hello "World.""
Bây giờ tôi có sự mơ hồ - trình thông dịch không biết chuỗi của tôi kết thúc ở đâu. Nếu tôi muốn giữ dấu ngoặc kép của mình, tôi có một số lựa chọn. Tôi có thể sử dụng các dấu ngoặc kép xung quanh chuỗi của mình:
'Hello "World."'
Hoặc tôi có thể thoát khỏi báo giá của mình:
"Hello \"World.\""
Bất kỳ dấu ngoặc kép nào đứng trước dấu gạch chéo đều được thoát và được hiểu là một phần giá trị của chuỗi.
Khi nói đến truy vấn, MySQL có một số từ khóa nhất định mà nó theo dõi mà chúng ta không thể sử dụng trong các truy vấn của mình mà không gây ra một số nhầm lẫn. Giả sử chúng ta có một bảng các giá trị trong đó một cột được đặt tên là "Chọn" và chúng ta muốn chọn:
SELECT select FROM myTable
Bây giờ chúng tôi đã đưa ra một số điều không rõ ràng trong truy vấn của chúng tôi. Trong truy vấn của chúng tôi, chúng tôi có thể giảm sự mơ hồ đó bằng cách sử dụng dấu tích sau:
SELECT `select` FROM myTable
Điều này loại bỏ sự nhầm lẫn mà chúng tôi đã giới thiệu bằng cách sử dụng phán đoán kém trong việc chọn tên trường.
Rất nhiều điều này có thể được xử lý cho bạn bằng cách chuyển các giá trị của bạn qua mysql_real_escape_string()
. Trong ví dụ bên dưới, bạn có thể thấy rằng chúng tôi đang chuyển dữ liệu do người dùng gửi thông qua chức năng này để đảm bảo rằng nó sẽ không gây ra bất kỳ sự cố nào cho truy vấn của chúng tôi:
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Các phương pháp khác tồn tại cho các chuỗi thoát, chẳng hạn như add_slashes
, addcslashes
, quotemeta
, và nhiều hơn nữa, mặc dù bạn sẽ thấy rằng khi mục tiêu là để chạy một truy vấn an toàn, bởi các nhà phát triển và lớn thích mysql_real_escape_string
hoặc pg_escape_string
(trong bối cảnh PostgreSQL.