sql >> Databasteknik >  >> RDS >> Mysql

PDO och MySQL fulltextsökningar

Detta är tyvärr ett konstigt undantag från användningen av frågeparametrar (redigera: men uppenbarligen inte i den senaste punktutgåvan av varje MySQL-gren, se nedan).

Mönstret i AGAINST() måste vara en konstant sträng, inte en frågeparameter. Till skillnad från andra konstanta strängar i SQL-frågor kan du inte använda en frågeparameter här, helt enkelt på grund av en begränsning i MySQL.

För att interpolera sökmönster till frågor på ett säkert sätt, använd PDO::quote() fungera. Observera att PDO:s quote()-funktion redan lägger till citatavgränsare (till skillnad från 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");

Om kommentar från @YourCommonSense:

Du har rätt, jag testade just detta på MySQL 5.5.31, 5.1.68 och 5.0.96 (MySQL Sandbox är ett underbart verktyg), och det verkar som att dessa versioner accepterar frågeparametrar i AGAINST()-satsen i en dynamisk SQL-fråga.

Jag har fortfarande ett minne av en konflikt som existerade i det förflutna. Kanske har det korrigerats i den senaste punktutgåvan av varje gren. Till exempel hittar jag dessa relaterade buggar:



  1. Kopiera en tabell från en databas till en annan i Postgres

  2. Gruppera WHERE-satser i Codeigniter

  3. Visa alltid decimaler i SQL?

  4. Konvertera valda kolumnvärden till en annan rad med select med samma id part2