Có thể không có chủ đề, nhưng có lẽ bạn đã đến đây để tìm cách vệ sinh đầu vào văn bản từ dạng HTML, để khi người dùng nhập ký tự dấu nháy đơn, nó không bị lỗi khi bạn cố gắng viết văn bản vào SQL Bảng dựa trên DB. Có một vài cách để làm điều này, và bạn cũng có thể muốn đọc về SQL tiêm. Dưới đây là một ví dụ về việc sử dụng các câu lệnh đã chuẩn bị và các tham số ràng buộc trong PHP:
$input_str = "Here's a string with some apostrophes [']";
// sanitise it before writing to the DB [assumes PDO]
$sql = "INSERT INTO `table` [`note`] VALUES [:note]";
try {
$stmt = $dbh->prepare[$sql];
$stmt->bindParam[':note', $input_str, PDO::PARAM_STR];
$stmt->execute[];
} catch [PDOException $e] {
return $dbh->errorInfo[];
}
return "success";
Trong trường hợp đặc biệt mà bạn có thể muốn lưu trữ dấu nháy đơn của mình bằng cách sử dụng tài liệu tham khảo thực thể HTML của họ, PHP có hàm htmlspecialchars [] sẽ chuyển đổi chúng thành
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+3. Như các ý kiến chỉ ra, điều này không nên được sử dụng để thay thế cho việc vệ sinh thích hợp, theo ví dụ được đưa ra.
Đôi khi bạn có thể cần lưu trữ trích dẫn đơn, trích dẫn kép, apostrophe, backticks và các ký tự đặc biệt khác trong MySQL. Trong bài viết này, chúng tôi sẽ xem xét cách thoát khỏi trích dẫn đơn, trích dẫn kép, dấu nháy đơn, backticks và các nhân vật đặc biệt khác.
Bạn có thể dễ dàng thoát khỏi các trích dẫn đơn, trích dẫn kép, apostrophe, backticks và các ký tự đặc biệt khác bằng cách thêm dấu gạch chéo ngược [\] trước ký tự đó.
Ở đây, một truy vấn MySQL thoát khỏi các trích dẫn đơn lẻ.
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+
Như bạn có thể thấy trích dẫn duy nhất đã được thoát ra và được hiển thị trong kết quả truy vấn.
Tương tự, đây là truy vấn MySQL để thoát khỏi trích dẫn kép
mysql> select 'test\"s' as test_string; +-------------+ | test_string | +-------------+ | test"s | +-------------+
Tương tự, chúng ta có thể sử dụng Backslash để thoát khỏi các trích dẫn đơn và trích dẫn gấp đôi để chèn các giá trị vào bảng MySQL.
Hãy để chúng tôi nói rằng bạn có bảng sau Escape_characters_demo [id, chuỗi]
mysql> create table escape_characters_demo[ id int, string varchar[255] ];
Bây giờ chúng ta hãy thử chèn các văn bản với các trích dẫn đơn, backticks và đôi và các kết hợp của chúng, sử dụng dấu gạch chéo ngược.
mysql> mysql> insert into escape_characters_demo[id, string] values[1, 'test\'s'], [2, 'test\"s'], [3, 'test\`s'], [4, 'test\'s and best\'s'], [5, 'test\"s and best\"s'], [6, 'test\"s and best\'s']; mysql> select * from escape_characters_demo; +------+-------------------+ | id | string | +------+-------------------+ | 1 | test's | | 2 | test"s | | 3 | test`s | | 4 | test's and best's | | 5 | test"s and best"s | | 6 | test"s and best's | +------+-------------------+
Như bạn có thể thấy ở trên, chúng tôi có thể thoát khỏi các trích dẫn đơn, trích dẫn kép, backticks, nhiều trích dẫn đơn và đôi và thậm chí là sự kết hợp của chúng, bằng cách thêm một dấu gạch chéo ngược trước các ký tự đặc biệt này.
Hy vọng, bây giờ bạn có thể dễ dàng thoát khỏi các ký tự đặc biệt trong các truy vấn chọn, chèn và cập nhật của bạn.
UBIQ giúp bạn dễ dàng trực quan hóa dữ liệu và theo dõi chúng trong bảng điều khiển thời gian thực. Hãy thử UBIQ miễn phí.
Bài viết liên quan:
- về tác giả
Làm cách nào để bỏ qua một báo giá duy nhất trong mysql? Sử dụng dấu ngoặc kép ở đây là một số ví dụ đầu vào và đầu ra:Dấu ngoặc kép
SELECT "test", "'test'", "''test''", "te""st";
Đầu ra trông như thế này:
Bao bọc 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 dự kiến của các trích dẫn duy nhất 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 trích dẫn kép ở giữa chuỗi sẽ hủy bỏ một trong số chúng.
Dấu nháy đơn
Sử dụng các trích dẫn đơ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:
Bao bọc 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 dự kiến của các trích dẫn duy nhất 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 trích dẫn kép ở giữa chuỗi sẽ hủy bỏ một trong số chúng.
Dấu nháy đơn
Sử dụng các trích dẫn đơn ở đây là một số ví dụ đầu vào và đầu ra:
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 trích dẫn kép để trình bày báo cáo phản hồi của khách hàng trong chuỗi, bạn có thể sử dụng các trích dẫn đơn để bọc toàn bộ chuỗi.
SELECT 'They responded, "We found this tutorial helpful"'
Nếu bạn cần sử dụng trích dẫn đơn và trích dẫn kép trong một chuỗi chứa cả co lại và báo giá, 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 điều này 'sẽ nhận ra dấu gạch chéo ngược là một hướng dẫn để hủy bỏ ý nghĩa cú pháp trích dẫn đơn 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"'
Backticks
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ụ dưới đây, chúng tôi đang gọi đến bảng có tiêu đề
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+4 và cột
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+5. Sử dụng backticks, chúng tôi đang biểu thị rằng đó là tên cột và bảng.
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+0
Backticks cho tên cột có thể không cần thiết mặc dù.
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+1
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 tôi đã học được ở đây, bao gồm các trích dẫn kép, trích dẫn đơn và backticks.
mysql> select 'test\'s' as test_string; +-------------+ | test_string | +-------------+ | test's | +-------------+2
Sẽ trở lại: