Toto je bohužel zvláštní výjimka z použití parametrů dotazu (edit: ale zjevně ne v nejnovějším vydání každé větve MySQL, viz níže).
Vzor v AGAINST()
musí být konstantní řetězec, nikoli parametr dotazu. Na rozdíl od jiných konstantních řetězců v dotazech SQL zde nemůžete použít parametr dotazu, jednoduše kvůli omezení v MySQL.
Chcete-li bezpečně interpolovat vyhledávací vzory do dotazů, použijte PDO::quote() funkce. Všimněte si, že funkce quote() PDO již přidává oddělovače citací (na rozdíl od 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");
Znovu komentář od @YourCommonSense:
Máte pravdu, právě jsem to testoval na MySQL 5.5.31, 5.1.68 a 5.0.96 (MySQL Sandbox je skvělý nástroj) a zdá se, že tyto verze přijímají parametry dotazu v klauzuli AGAINST() dynamický SQL dotaz.
Stále si vzpomínám na konflikt existující v minulosti. Možná to bylo opraveno v nejnovějším vydání každé větve. Například jsem našel tyto související chyby:
- Použití parametru uložené procedury v klauzuli AGAINST() vždy vrátí stejný výsledek:http://bugs.mysql.com/bug.php?id=3734
- Srážka nebo podivné výsledky s připraveným příkazem, MATCH a FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496