Detta är tyvärr ett konstigt undantag från användningen av frågeparametrar (redigera: men uppenbarligen inte i den senaste punktutgåvan av varje MySQL-gren, se nedan).
Mönstret i AGAINST()
måste vara en konstant sträng, inte en frågeparameter. Till skillnad från andra konstanta strängar i SQL-frågor kan du inte använda en frågeparameter här, helt enkelt på grund av en begränsning i MySQL.
För att interpolera sökmönster till frågor på ett säkert sätt, använd PDO::quote() fungera. Observera att PDO:s quote()-funktion redan lägger till citatavgränsare (till skillnad från 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");
Om kommentar från @YourCommonSense:
Du har rätt, jag testade just detta på MySQL 5.5.31, 5.1.68 och 5.0.96 (MySQL Sandbox är ett underbart verktyg), och det verkar som att dessa versioner accepterar frågeparametrar i AGAINST()-satsen i en dynamisk SQL-fråga.
Jag har fortfarande ett minne av en konflikt som existerade i det förflutna. Kanske har det korrigerats i den senaste punktutgåvan av varje gren. Till exempel hittar jag dessa relaterade buggar:
- Användning av en lagrad procedurparameter i AGAINST()-satsen returnerar alltid samma resultat:http://bugs.mysql.com/bug.php?id=3734
- Krasch eller konstiga resultat med förberett uttalande, MATCH och FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496