Dette er desværre en mærkelig undtagelse fra brugen af forespørgselsparametre (rediger: men tilsyneladende ikke i den seneste punktudgivelse af hver MySQL-gren, se nedenfor).
Mønsteret i AGAINST()
skal være en konstant streng, ikke en forespørgselsparameter. I modsætning til andre konstante strenge i SQL-forespørgsler kan du ikke bruge en forespørgselsparameter her, simpelthen på grund af en begrænsning i MySQL.
For at interpolere søgemønstre i forespørgsler sikkert, brug PDO::quote() fungere. Bemærk, at PDO's quote()-funktion allerede tilføjer citatafgrænsningerne (i modsætning til 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");
Rekommentar fra @YourCommonSense:
Du har ret, jeg har lige testet dette på MySQL 5.5.31, 5.1.68 og 5.0.96 (MySQL Sandbox er et vidunderligt værktøj), og det ser ud til, at disse versioner accepterer forespørgselsparametre i AGAINST()-sætningen i en dynamisk SQL-forespørgsel.
Jeg har stadig en erindring om en konflikt, der eksisterede i fortiden. Måske er det blevet rettet i den seneste punktudgivelse af hver gren. For eksempel finder jeg disse relaterede fejl:
- Brug af en lagret procedure-parameter i AGAINST()-sætningen returnerer altid det samme resultat:http://bugs.mysql.com/bug.php?id=3734
- Crash eller mærkelige resultater med forberedt udsagn, MATCH og FULLTEXT:http:// bugs.mysql.com/bug.php?id=14496