Infelizmente, esta é uma exceção estranha ao uso de parâmetros de consulta (editar: mas aparentemente não na versão mais recente de cada branch MySQL, veja abaixo).
O padrão em
AGAINST()
deve seja uma string constante, não um parâmetro de consulta. Ao contrário de outras strings constantes em consultas SQL, você não pode usar um parâmetro de consulta aqui, simplesmente devido a uma limitação no MySQL. Para interpolar padrões de pesquisa em consultas com segurança, use o PDO::quote() função. Observe que a função quote() do PDO já adiciona os delimitadores de aspas (diferente de 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");
Comentário de @YourCommonSense:
Você está certo, acabei de testar isso no MySQL 5.5.31, 5.1.68 e 5.0.96 (MySQL Sandbox é uma ferramenta maravilhosa), e parece que essas versões aceitam parâmetros de consulta na cláusula AGAINST() de um consulta SQL dinâmica.
Ainda me lembro de um conflito existente no passado. Talvez tenha sido corrigido na versão mais recente de cada branch. Por exemplo, encontro estes bugs relacionados:
- Usar um parâmetro de procedimento armazenado na cláusula AGAINST() sempre retorna o mesmo resultado:http://bugs.mysql.com/bug.php?id=3734
- Erro ou resultados estranhos com declaração preparada, MATCH e FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496