Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thoát thẻ hoang dã MySQL

_% không phải là các ký tự đại diện trong MySQL nói chung, và không được thoát ra ngoài với mục đích đưa chúng vào các ký tự chuỗi thông thường. mysql_real_escape_string là đúng và đủ cho mục đích này. addcslashes không nên được sử dụng.

_% đặc biệt chỉ trong ngữ cảnh của LIKE -tối hợp. Khi bạn muốn chuẩn bị các chuỗi để sử dụng theo nghĩa đen trong LIKE sao cho 100% đối sánh một trăm phần trăm chứ không phải chỉ bất kỳ chuỗi nào bắt đầu bằng một trăm, bạn có hai cấp độ để thoát khỏi lo lắng.

Đầu tiên là thoát LIKE. Việc xử lý LIKE diễn ra hoàn toàn bên trong SQL và nếu bạn muốn biến một chuỗi ký tự thành biểu thức LIKE theo nghĩa đen, bạn phải thực hiện bước này ngay cả khi bạn đang sử dụng truy vấn được tham số hóa !

Trong lược đồ này, _% là đặc biệt và phải được thoát ra. Nhân vật thoát cũng phải thoát. Theo ANSI SQL, các ký tự khác với những ký tự này không được được thoát:\' sẽ sai. (Mặc dù MySQL thường sẽ cho phép bạn xử lý nó.)

Sau khi thực hiện xong việc này, bạn tiến tới cấp thoát thứ hai, đó là thoát theo nghĩa đen của chuỗi cũ. Điều này diễn ra bên ngoài SQL, tạo SQL, vì vậy phải được thực hiện sau bước thoát LIKE. Đối với MySQL, đây là mysql_real_escape_string như trước; đối với các cơ sở dữ liệu khác sẽ có một chức năng khác, bạn chỉ có thể sử dụng các truy vấn được tham số hóa để tránh phải thực hiện.

Vấn đề dẫn đến sự nhầm lẫn ở đây là trong MySQL sử dụng dấu gạch chéo ngược làm ký tự thoát cho cả hai bước thoát lồng nhau! Vì vậy, nếu bạn muốn so khớp một chuỗi với dấu phần trăm theo nghĩa đen, bạn sẽ phải thoát dấu gạch chéo ngược kép và nói LIKE 'something\\%' . Hoặc, nếu đó là trong PHP " chữ cũng sử dụng thoát dấu gạch chéo ngược, "LIKE 'something\\\\%'" . Argh!

Điều này không chính xác theo ANSI SQL, nói rằng:trong chuỗi ký tự gạch chéo ngược có nghĩa là dấu gạch chéo ngược theo nghĩa đen và cách để thoát khỏi một dấu ngoặc kép là ''; trong biểu thức LIKE, không có ký tự thoát nào theo mặc định.

Vì vậy, nếu bạn muốn LIKE-Escape theo cách di động, bạn nên ghi đè hành vi mặc định (sai) và chỉ định ký tự thoát của riêng bạn, sử dụng LIKE ... ESCAPE ... xây dựng. Để tỉnh táo, chúng tôi sẽ chọn thứ gì đó khác ngoài dấu gạch chéo ngược chết tiệt!

Hàm
function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

hoặc với các tham số (ví dụ:trong PDO):

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

(Nếu bạn muốn có thêm thời gian cho bữa tiệc linh hoạt hơn, bạn cũng có thể thử tính toán cho MS SQL Server và Sybase, nơi [ ký tự cũng, không chính xác, đặc biệt trong một LIKE tuyên bố và phải được thoát. argh.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ LAST_DAY () - MySQL

  2. Mô phỏng ORDER BY FIELD () của MySQL trong Postgresql

  3. Làm cách nào để lấy ID của nhiều hàng được chèn trong MySQL?

  4. MySQL - Phiên bản MySQL này chưa hỗ trợ 'LIMIT &IN / ALL / ANY / SOME truy vấn con

  5. Ví dụ DAYOFWEEK () - MySQL