Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO- und MySQL-Volltextsuche

Dies ist leider eine seltsame Ausnahme von der Verwendung von Abfrageparametern (Bearbeiten: aber anscheinend nicht in der neuesten Point-Release jedes MySQL-Zweigs, siehe unten).

Das Muster in AGAINST() muss eine konstante Zeichenfolge sein, kein Abfrageparameter. Im Gegensatz zu anderen konstanten Zeichenfolgen in SQL-Abfragen können Sie hier keinen Abfrageparameter verwenden, einfach aufgrund einer Beschränkung in MySQL.

Um Suchmuster sicher in Abfragen einzufügen, verwenden Sie das PDO::quote() Funktion. Beachten Sie, dass die Funktion quote() von PDO bereits die Trennzeichen für Anführungszeichen hinzufügt (im Gegensatz zu 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-Kommentar von @YourCommonSense:

Sie haben Recht, ich habe dies gerade auf MySQL 5.5.31, 5.1.68 und 5.0.96 getestet (MySQL Sandbox ist ein wunderbares Tool), und es scheint, dass diese Versionen Abfrageparameter in der AGAINST()-Klausel von a akzeptieren dynamische SQL-Abfrage.

Ich habe noch eine Erinnerung an einen Konflikt, der in der Vergangenheit bestand. Vielleicht wurde es in der neuesten Point-Release jedes Zweigs korrigiert. Zum Beispiel finde ich diese verwandten Fehler: