Sfortunatamente questa è una strana eccezione all'uso dei parametri di query (edit: ma a quanto pare non nella versione più recente di ciascun ramo MySQL, vedi sotto).
Il modello in AGAINST()
deve essere una stringa costante, non un parametro di query. A differenza di altre stringhe costanti nelle query SQL, qui non è possibile utilizzare un parametro di query, semplicemente a causa di una limitazione in MySQL.
Per interpolare i modelli di ricerca nelle query in modo sicuro, utilizza PDO::quote() funzione. Nota che la funzione quote() di PDO aggiunge già i delimitatori di virgolette (a differenza di 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");
Commento di @YourCommonSense:
Hai ragione, l'ho appena testato su MySQL 5.5.31, 5.1.68 e 5.0.96 (MySQL Sandbox è uno strumento meraviglioso) e sembra che queste versioni accettino parametri di query nella clausola AGAINST() di un interrogazione SQL dinamica.
Ho ancora un ricordo di un conflitto esistente in passato. Forse è stato corretto nella versione più recente di ciascun ramo. Ad esempio, trovo questi bug correlati:
- L'utilizzo di un parametro di procedura memorizzata nella clausola AGAINST() restituisce sempre lo stesso risultato:http://bugs.mysql.com/bug.php?id=3734
- Risultati di crash o strani con istruzione preparata, MATCH e FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496