2016-11-12 2 views
0

Ich arbeite an einem Projekt, das eine Suchmaschine benötigt.
Ich bin mir der MySQL-Funktion FULLTEXT IN BOOLEAN MODE bewusst. Aber meine aktuelle Implementierung kann einfach durch Hinzufügen von Anführungszeichen in dem Textfeld gebrochen werden ...
Was ich brauche:
eine Suchmaschine, die wie +obligatory für Funktionen ermöglicht, optional, "complete phrase" und -mustNotContain und sortiert die Ergebnisse entsprechend (die meisten Matches auf Top etc.)
Implementieren (fast) voll funktionsfähig Volltextsuche mit PHP + mysql

Mögliche Lösungen ich denke an:
eine Funktion, die den Suchbegriff in einer Art und Weise entweicht, die genannten Eigenschaften bestehen bleiben, aber der MySQL wird nicht wütend, wenn die Syntax völlig falsch ist.

Ein komplett mysql-unabhängige in PHP geschrieben Suchalgorithmus (Bitte sagen Sie mir, ob es irgendwelche Bibliotheken würden Sie vorschlagen), die die gleiche Sache tut (und erlaubt es vielleicht für Auto komplett - komplett optional)

wenn Sie sich fragten, was meine aktuelle Implementierung ist, ist es zur Zeit etwas Grundsätzliches und unfertig wie

$result = $mysqli -> query("SELECT * FROM table WHERE MATCH(TITLE) AGAINST('$q' IN BOOLEAN MODE) ORDER BY MATCH(TITLE) AGAINST('$q' IN BOOLEAN MODE)") 

Jede Hilfe ist willkommen!

+0

** WARNUNG **: Wenn Sie 'mysqli' verwenden, sollten Sie [parametrisierte Abfragen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und [' bind_param' verwenden ] (http://php.net/manual/en/mysqli-stmt.bind-param.php), um Benutzerdaten zu Ihrer Anfrage hinzuzufügen. ** Verwenden Sie NICHT ** String-Interpolation oder Verkettung, um dies zu erreichen, weil Sie einen schwerwiegenden [SQL injection bug] erstellt haben (http://bobby-tables.com/). ** NIEMALS ** $ _POST 'oder' $ _GET' Daten direkt in eine Abfrage einfügen, es kann sehr schädlich sein, wenn jemand versucht, Ihren Fehler auszunutzen. – tadman

+0

Schreiben Sie Ihre eigene Suchmaschine ist sehr, sehr schwer. Wenn die Volltextsuche nicht angemessen ist, sollten Sie Tools wie [Elastische Suche] (https://www.elastic.co) oder [Sphinx] (http://sphinxsearch.com) verwenden. Wenn Sie Ihre eigene Suchmaschine schreiben könnten, würden Sie für Google arbeiten. – tadman

+0

Ich weiß, aber bevor mein Projekt fertig ist, ist es einfacher ... – RoiEX

Antwort

2

Sie möchten wirklich mysqli :: prepare verwenden, anstatt die Suchzeichenfolge in die Abfrage zu interpolieren (siehe http://php.net/manual/en/mysqli.prepare.php). Das Ergebnis sollte ungefähr so ​​aussehen.

$statement = $mysqli->prepare("SELECT * FROM table WHERE MATCH(TITLE) AGAINST(? IN BOOLEAN MODE) ORDER BY MATCH(TITLE) AGAINST(? IN BOOLEAN MODE)"); 
$statement->bind_param("ss", $q, $q); 
$statement->execute(); 
$result = $statement->get_result(); 

Die Anweisung wird zuerst vorbereitet und dann werden die Parameter an die Fragezeichen-Platzhalter gebunden. Es ist kein manuelles Entkommen erforderlich.

+0

Ich dachte darüber nach, das zu verwenden. Leider behebt dies nicht alle Probleme. Zum Beispiel bewirkt der String '+ -', dass die Abfrage nicht funktioniert, weil dies keine Art von SQL-Injection ist, sondern ein Syntaxfehler im MATCH gegen die Syntax – RoiEX

+0

Ah, ich verstehe, wenn ich http: // dev verstehe .mysql.com/doc/refman/5.7/en/fulltext-boolean.html korrekt, sollte der Satz, der das +, - usw. mit doppelten Anführungszeichen enthält, funktionieren. Von wem kommt $ q? Enthält es ein Wort oder mehrere? – Martin

+0

$ q ist in meinem Fall die Variable $ _GET ['q'] von einem HTML-Formular textfield aka rohe Benutzereingabe – RoiEX