Moin,
ich hab mir mal so ne kleine Suche gebastelt und die würde ich jetzt liebend gerne um ein feature erweitern. Und zwar soll der user seine suchstrings kombinieren können, ganz a la Google + co. mit "AND", "OR", "+", "-", etc. Nur wie geht das bitte möglichst ohne schier endlose Verschachtelungen von wegen if(preg_matach[...]) oder so. Google half mir ledier nicht weiter, da ich gar nicht richtig weiß wonach ich suchen soll.
Zunächst mal brauchst du einen Parser der dir deine Suchanfrage in appetitliche Happen zerlegt. In deinem Fall gibt es wohl zwei Arten von Happen: Suchwörter/-strings und Operatoren. Wie man das im Allgemeinen tut habe ich in </archiv/2004/7/84947/#m498922> beschrieben, hier in diesem speziellen Fall sollte es wohl auch ein Regex tun welcher nach AND/OR/+/- sowie Leerzeichen sucht und alles andere einfach so übernimmt.
Wenn du den Teil fertig hast sollte er in der Lage sein aus einer Eingabe wie
ich +suche OR jetzt -nach AND was tollem
etwas wie
String: ich
Operator: AND
String: suche
Operator: OR
String: jetzt
Operator: NOT
String: nach
Operator: AND
String: was
String: tollem
(zum Beispiel als Array) zu machen. Jetzt musst du zwischen Wörtern zwischen denen kein Operator steht irgendeinen Standardoperator, vermutlich AND, einfügen.
Das formst du nun in eine MySQL-Abfrage um: Die Strings werden zu "foo LIKE '%string%'", die Operatoren übernimmst du einfach so. (Fast; "AND" und "OR" können so bleiben, bei "NOT" musst du aufpassen: Wenn das NOT am Anfang steht oder direkt nach einem OR kann es so bleiben, sonst muss noch ein AND davor.) Die Teilstücke werden dann einfach hintereinander geklebt:
foo LIKE '%ich%' AND foo LIKE '%suche%' OR foo LIKE '%jetzt%' AND NOT foo LIKE '%nach%' AND foo LIKE '%was%' AND foo LIKE '%tollem%'
Fertig ist deine Where-Bedingung. (In Wirklichkeit willst du natürlich den Volltextindex statt LIKE '%... benutzen.) Als Verbesserung bietet sich an, auch Anführungszeichen zu interpretieren und alles darin eingeschlossene als String zu betrachten. Bestimmt willst du auch die Syntax der Abfrage prüfen ("foo AND OR bar" gibt nicht so viel Sinn) und geeignete Maßnahmen treffen.
Wenn du Klammerungen erlauben willst, kannst du die auf genau die gleiche Weise in die MySQL-Abfrage übernehmen, da ist nur die Prüfung auf korrekte Syntax etwas schwerer. (Da könnte fast das oben verlinkte Posting notwendig sein.)
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~