C'est malheureusement une étrange exception à l'utilisation des paramètres de requête (edit : mais apparemment pas dans la version ponctuelle la plus récente de chaque branche MySQL, voir ci-dessous).
Le modèle dans AGAINST()
doit être une chaîne constante, pas un paramètre de requête. Contrairement à d'autres chaînes constantes dans les requêtes SQL, vous ne pouvez pas utiliser de paramètre de requête ici, simplement à cause d'une limitation de MySQL.
Pour interpoler les modèles de recherche dans les requêtes en toute sécurité, utilisez le PDO::quote() une fonction. Notez que la fonction quote() de PDO ajoute déjà les délimiteurs entre guillemets (contrairement à 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 commentaire de @YourCommonSense :
Vous avez raison, je viens de tester cela sur MySQL 5.5.31, 5.1.68 et 5.0.96 (MySQL Sandbox est un outil merveilleux), et il semble que ces versions acceptent les paramètres de requête dans la clause AGAINST() d'un requête SQL dynamique.
J'ai encore le souvenir d'un conflit existant dans le passé. Peut-être que cela a été corrigé dans la version la plus récente de chaque branche. Par exemple, je trouve ces bogues associés :
- L'utilisation d'un paramètre de procédure stockée dans la clause AGAINST() renvoie toujours le même résultat :http://bugs.mysql.com/bug.php?id=3734
- Crash ou résultats étranges avec une instruction préparée, MATCH et FULLTEXT :http:// bugs.mysql.com/bug.php?id=14496