2012-12-03 41 views
7

Tôi đang chuyển đổi tất cả mã trang web của mình từ việc sử dụng hàm mysql_ * sang PDO. Tài liệu PHP về PDO không rõ ràng cho nhu cầu của tôi. Nó cung cấp cho bạn các chức năng để sử dụng, nhưng không đi vào chi tiết để giải thích chúng trong các kịch bản khác nhau.Tìm kiếm PDO và MySQL Toàn văn

Về cơ bản, tôi có một tìm kiếm toàn văn mysql:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)"; 

Báo cáo thực tế lâu hơn nữa, nhưng đây là những gì nó về cơ bản không.

Câu hỏi của tôi là, tôi sẽ kết hợp điều này vào PDO như thế nào?

Tôi biết bạn không có ý định sử dụng dấu ngoặc kép quanh dấu vị trí, vì vậy bạn có để chúng trong hàm AGAINST() không? Tôi có bao gồm chúng không? Nếu tôi bỏ chúng ra, điều gì sẽ xảy ra với biểu tượng ký tự đại diện, v.v ...?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE"); 
$sql->bindValue(':searchText', $searchFor . '*'); 

Trả lời

12

Đây là tiếc là một ngoại lệ kỳ lạ đến việc sử dụng các tham số truy vấn (chỉnh sửa: nhưng dường như không có trong điểm phát hành gần đây nhất của từng ngành MySQL, xem dưới đây).

Mẫu trong AGAINST()phải là chuỗi không đổi, không phải là tham số truy vấn. Không giống như các chuỗi không đổi khác trong các truy vấn SQL, bạn không thể sử dụng tham số truy vấn ở đây, đơn giản chỉ vì một hạn chế trong MySQL.

Để nội suy mẫu tìm kiếm thành truy vấn một cách an toàn, hãy sử dụng hàm PDO::quote(). Lưu ý rằng hàm quote() của PDO đã thêm các dấu phân cách trích dẫn (không giống như mysql_real_escape_string()).

$quoted_search_text = $this->db->quote('+word +word'); 

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE"); 

Re bình luận từ @YourCommonSense:

Bạn nói đúng, tôi chỉ thử nghiệm này trên MySQL 5.5.31, 5.1.68, 5.0.96 và (MySQL Sandbox là một công cụ tuyệt vời) và dường như các phiên bản này chấp nhận các tham số truy vấn trong mệnh đề AGAINST() của truy vấn SQL động.

Tôi vẫn có một hồi ức về xung đột hiện có trong quá khứ. Có lẽ nó đã được sửa chữa trong lần phát hành gần đây nhất của mỗi nhánh. Ví dụ, tôi tìm thấy những lỗi liên quan:

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn, và giải pháp thay thế :) –

+2

tôi không thể tái sản xuất này "lạ" hành vi bạn đang nói về. 'AGAINST (? IN BOOLEAN MODE)' hoạt động tốt cho tôi. Bạn đang sử dụng phiên bản Mysql nào? –

+0

Tất nhiên chế độ mô phỏng được tắt và kiểm tra lại. –

0
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}"; 

try { 
    $database->prepare($sql); 
    $database->bindParam(':searchstr', $search); 
    $database->execute(); 
    $result_array = $database->fetch_array($sql); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
Các vấn đề liên quan