Sử dụng Backticks, Double Quotes và Single Quotes khi truy vấn cơ sở dữ liệu MySQL có thể rút gọn thành hai điểm cơ bản
- Dấu ngoặc kép [Đơn và Đôi] được sử dụng xung quanh chuỗi
- Backticks được sử dụng xung quanh định danh bảng và cột
Dấu ngoặc kép
Sử dụng dấu ngoặc kép ở đây là một số ví dụ đầu vào và đầu ra
SELECT "test", "'test'", "''test''", "te""st";
Đầu ra trông như thế này
Gói các trích dẫn đơn bên trong các trích dẫn kép sẽ hủy bỏ hành vi mong đợi của các trích dẫn đơn trong Truy vấn MySQL và thay vào đó coi nó như một phần của chuỗi. Điều này có thể được nhìn thấy trong các cột 2 và 3 trong ví dụ trên
Chèn hai dấu ngoặc kép vào giữa chuỗi sẽ hủy bỏ một trong số chúng
Dấu nháy đơn
Sử dụng dấu ngoặc đơn ở đây là một số ví dụ đầu vào và đầu ra
SELECT 'test', '"test"', '""test""', 'te''st';
Đầu ra trông như thế này
Như thể hiện trong phần trình diễn ở trên, dấu ngoặc đơn hoạt động giống như dấu ngoặc kép trong các ngữ cảnh này
Sử dụng dấu ngoặc đơn và dấu ngoặc kép cùng nhau
Thông thường sẽ có một sự co lại trong một chuỗi hoặc một trích dẫn trực tiếp. Trong các tình huống như trong các báo cáo khảo sát của NPS hoặc các biểu mẫu phản hồi khác của khách hàng, trường hợp này thường xảy ra. Trong những trường hợp này, sử dụng dấu ngoặc kép để bọc một chuỗi văn bản có chứa một dấu nháy đơn như They've sẽ giữ dấu nháy đơn trong chuỗi dưới dạng dấu nháy đơn
Trong trường hợp này, việc trình bày một chuỗi có rút gọn sẽ trông như thế này
SELECT "They've found this tutorial to be helpful"
Đầu ra trông như thế này
Hoặc, nếu bạn cần sử dụng dấu ngoặc kép để trình bày báo giá phản hồi của khách hàng trong chuỗi, thì bạn có thể sử dụng dấu ngoặc đơn để bao toàn bộ chuỗi
SELECT 'They responded, "We found this tutorial helpful"'
Nếu bạn cần sử dụng dấu ngoặc đơn và dấu ngoặc kép trong một chuỗi chứa cả dấu ngoặc kép và dấu ngoặc kép, bạn sẽ cần sử dụng dấu gạch chéo ngược ‘' để hủy bỏ ký tự sau. Ví dụ. một chuỗi chứa ' này sẽ nhận ra dấu gạch chéo ngược như một hướng dẫn để hủy bỏ ý nghĩa cú pháp của trích dẫn đơn lẻ và thay vào đó chèn nó vào chuỗi dưới dạng dấu nháy đơn
SELECT 'They\'ve responded, "We found this tutorial helpful"'
đánh dấu ngược
Backticks được sử dụng trong MySQL để chọn các cột và bảng từ nguồn MySQL của bạn. Trong ví dụ bên dưới, chúng tôi đang gọi đến bảng có tiêu đề Album
và cột Title
. Sử dụng backticks, chúng tôi đang biểu thị rằng đó là tên cột và bảng
SELECT `Album`.`Title`
FROM `Album` AS `Album`
GROUP BY `Album`.`Title`
ORDER BY `Title` ASC
LIMIT 10;
Dấu gạch ngược cho tên cột có thể không cần thiết
SELECT Album.Title
FROM Album AS Album
GROUP BY Album.Title
ORDER BY Title ASC
LIMIT 10;
Cả hai truy vấn này sẽ trả về cùng một kết quả
Để tất cả chúng cùng nhau
Truy vấn sau đây sẽ sử dụng tất cả những gì chúng ta đã học ở đây, bao gồm dấu nháy kép, dấu nháy đơn và dấu nháy ngược
Vì vậy, bạn đang vui vẻ viết mã, thiết lập xác thực dữ liệu của mình, khi bạn nhận ra rằng bạn đột nhiên không thể xác thực tên “John O'Neil” — điều gì mang lại? . Tôi sẽ cho rằng việc xác thực dữ liệu của bạn đã hoạt động hoàn hảo—nếu không, thì bạn cần phải làm cho nó hoạt động hiệu quả
Vấn đề tiềm ẩn 1 - Thoát khỏi dấu gạch chéo ngược
Trước tiên, hãy đảm bảo rằng biến bạn đang kiểm tra không có bất kỳ dấu gạch chéo ngược không mong muốn nào thoát khỏi dấu nháy đơn. Bạn có thể làm điều này với hàm Stripslashes[] trong PHP. Mã của bạn sẽ trông giống như thế này
$my_name_field = $_POST['name'];
$my_name_field = stripslashes[$my_name_field];
Nếu bạn sử dụng phương pháp này, hãy nhớ rằng sau này bạn có thể cần phải thoát lại các trích dẫn đó nếu bạn đang làm một việc gì đó như đưa dữ liệu vào cơ sở dữ liệu. Bạn cũng có thể chỉ cần sử dụng dấu ngoặc kép để đưa nó vào cơ sở dữ liệu, điều này sẽ loại bỏ vấn đề thoát lại
Vấn đề tiềm ẩn 2 - Regex của bạn có thể sai
Khi bạn đặt trích dẫn đơn vào biểu thức chính quy của mình, hãy thoát nó bằng dấu gạch chéo ngược và sau đó nhớ thay đổi các trích dẫn xung quanh thành trích dẫn kép nếu bạn đang sử dụng dấu ngoặc đơn. Ví dụ: một hàm trả về true hoặc false cho một tên hợp lệ bao gồm chữ cái ASCII viết hoa và viết thường, dấu gạch nối, dấu chấm, dấu phẩy, dấu cách và dấu nháy đơn trông như thế này
SELECT 'test', '"test"', '""test""', 'te''st';
0Điều đó sẽ xử lý bất kỳ tên tiếng Anh hợp lệ nào. Tất nhiên, nếu bạn xử lý nhiều tên có ký tự nằm ngoài những ký tự được chỉ định, bạn sẽ muốn sửa đổi tên đó cho phù hợp với nhu cầu của mình
Vấn đề tiềm ẩn 3 — Điều gì sẽ xảy ra nếu bạn không thể thoát khỏi nhát chém?
Có thể, vì lý do nào đó, bạn không thể xóa dấu gạch chéo thoát. Nếu trường hợp này xảy ra, chỉ cần loại bỏ nó trong chức năng trên thay vì thực hiện trong mã chính. Giả sử bạn không chuyển biến theo tham chiếu, dấu gạch chéo vẫn ở vị trí trong biến bạn cần, nó chỉ bị xóa trong biến tạm thời trong hàm
Ngoài ra, bạn chỉ có thể thêm dấu gạch chéo ngược vào danh sách các ký tự được phép của mình… Tuy nhiên, tôi sẽ cố gắng tránh điều này… bạn không bao giờ biết một số cá nhân độc hại có thể nghĩ ra điều gì nếu bạn cho phép các ký tự thoát vào đầu vào của mình
Vẫn không hoạt động?
Nếu cách trên không hoạt động và bạn không thể hiểu tại sao, hãy sử dụng hàm str_replace[] trong hàm để loại bỏ tất cả các dấu nháy đơn, như thế này.
SELECT 'test', '"test"', '""test""', 'te''st';
1. Tuy nhiên, hãy chắc chắn rằng bạn chỉ làm điều đó trong hàm và không chuyển nó trở lại mã chính, nếu không, bạn sẽ mất hoàn toàn dấu nháy đơn