Jest to niestety dziwny wyjątek od używania parametrów zapytania (edycja: ale najwyraźniej nie w najnowszym wydaniu punktowym każdej gałęzi MySQL, patrz poniżej).
Wzorzec w AGAINST()
musi być stałym ciągiem, a nie parametrem zapytania. W przeciwieństwie do innych stałych łańcuchów w zapytaniach SQL, nie możesz tutaj użyć parametru zapytania, po prostu z powodu ograniczeń w MySQL.
Aby bezpiecznie interpolować wzorce wyszukiwania do zapytań, użyj PDO::quote() funkcjonować. Zauważ, że funkcja quote() w PDO już dodaje ograniczniki cytatów (w przeciwieństwie do 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");
Ponownie komentarz od @YourCommonSense:
Masz rację, właśnie przetestowałem to na MySQL 5.5.31, 5.1.68 i 5.0.96 (MySQL Sandbox to wspaniałe narzędzie) i wygląda na to, że te wersje akceptują parametry zapytania w klauzuli AGAINST() dynamiczne zapytanie SQL.
Wciąż mam w pamięci konflikt z przeszłości. Być może zostało to poprawione w najnowszym wydaniu punktowym każdej gałęzi. Na przykład znajduję te powiązane błędy:
- Użycie parametru procedury składowanej w klauzuli AGAINST() zawsze zwraca ten sam wynik:http://bugs.mysql.com/bug.php?id=3734
- Awaria lub dziwne wyniki z przygotowanym oświadczeniem, MATCH i FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496