Desafortunadamente, esta es una extraña excepción al uso de parámetros de consulta (editar: pero aparentemente no en el lanzamiento puntual más reciente de cada rama de MySQL, ver más abajo).
El patrón en AGAINST()
debe ser una cadena constante, no un parámetro de consulta. A diferencia de otras cadenas constantes en consultas SQL, no puede usar un parámetro de consulta aquí, simplemente debido a una limitación en MySQL.
Para interpolar patrones de búsqueda en consultas de forma segura, utilice PDO::quote() función. Tenga en cuenta que la función quote() de PDO ya agrega los delimitadores de comillas (a diferencia 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");
Re comentario de @YourCommonSense:
Tiene razón, acabo de probar esto en MySQL 5.5.31, 5.1.68 y 5.0.96 (MySQL Sandbox es una herramienta maravillosa), y parece que estas versiones aceptan parámetros de consulta en la cláusula AGAINST() de un Consulta SQL dinámica.
Todavía tengo un recuerdo de un conflicto existente en el pasado. Quizás se haya corregido en el más reciente point-release de cada rama. Por ejemplo, encuentro estos errores relacionados:
- Usar un parámetro de procedimiento almacenado en la cláusula AGAINST() siempre devuelve el mismo resultado:http://bugs.mysql.com/bug.php?id=3734
- Bloqueo o resultados extraños con declaración preparada, COINCIDIR y TEXTO COMPLETO:http:// bugs.mysql.com/bug.php?id=14496