Suche mit beliebig vielen Werten und Argumenten und Operatoren

Purdey

Erfahrenes Mitglied
Hallo,

ich bin auf der Suche wie ich eine Suche baue in der ich nach bspw.

"created>2013-07-21+type:text+organization:'TEST'" suchen könnte

also ?query="created>2013-07-21+type:text+organization:'TEST'
ebenso sollte es möglich seien Opertatoren wie <> != = zu nutzen.

Und eine Sortierung sollte sich angeben lassen.

Wie packt man so etwas an?
Die Daten kommen alle aus einer MYSQL Datenbank.

Wer kann helfen

Greets
PuRdEY
 
Hi,

je nachdem wie komplex du es haben möchtest, kannst du mittels Stringfunktionen (u.a. [phpf]explode[/phpf]) oder es mit einem Parser probieren.

Ich schreib dir mal ein Beispiel.
 
Naja ich sag mal so es sollte beliebig viele Argumente und Operatoren geben können.

Die Argumente werden größtenteils auch die Spaltenamen sein oder man macht ein Mapping von spaltename zu wert?

Intressant wird wie ich die Operatoren in MYSQL interpretiere und umsetze in den dortigen querystring...

Vielen Dank schon mal.
 
Hier ist schon mal ein lauffähiger Ansatz (beachte bitte nich die Einrückungen, liegt an GitHub):

https://gist.github.com/ComFreek/49dfc4936aa2ac247805

Dies gibt bei folgender Eingabe
created>2013-07-21+type:text+organization:'TEST'
folgende Ausgabe aus:
Code:
array (size=3)
  0 => 
    array (size=3)
      'attr' => string 'created' (length=7)
      'op' => string '>' (length=1)
      'val' => string '2013-07-21' (length=10)
  1 => 
    array (size=3)
      'attr' => string 'type' (length=4)
      'op' => string ':' (length=1)
      'val' => string 'text' (length=4)
  2 => 
    array (size=3)
      'attr' => string 'organization' (length=12)
      'op' => string ':' (length=1)
      'val' => string 'TEST' (length=4)
Ein kleines Problem gibt es allerdings: es ist nicht ganz trivial Operatoren mit mehr als einem Zeichen mit diesem Ansatz zu unterstützen.
 
Vielen Dank, kannst du mir das noch bissl erklären, was wäre wenn ich nun mit einem TEXT komme der ?query="text:TEST+TEST2+TEST3 lautet?

Wie setze ich deine Ausgabe aus der Klasse dann in einen SQL Befehl um der in der tabelle xyz nach
text=TEST
text=TEST2
text=TEST3

Also in etwa SELECT * from xyz WHERE text="TEXT" OR text="TEXT2" OR text="TEXT3"

sucht?!

Wie könnte der OPEREATOR größer als 1 Zeichen sein?
bspw. könnte ja hier >= sein?
 
Vielen Dank, kannst du mir das noch bissl erklären, was wäre wenn ich nun mit einem TEXT komme der ?query="text:TEST+TEST2+TEST3 lautet?

Hab ich deine Grammatik wohl falsch verstanden?
Ich dachte, ein Suchquery ist so aufgebaut:
Code:
[attribute 0-n Zeichen][operator 1 Zeichen][value 0-n Zeichen]
Und folgendes Muster kann man dann mit dem Pluszeichen ('+') aneinandereihen.

Damit aus dem zurückgegebenen Array meiner Funktion ein SQL-Query wird, musst du wiederum das Array durchgehen und dein Query-Statement aufbauen.

Wie könnte der OPEREATOR größer als 1 Zeichen sein?
bspw. könnte ja hier >= sein?
Genau, z.B. >= oder !=.
Beide sind (mit der aktuellen Version) nicht möglich.
 
Hab ich deine Grammatik wohl falsch verstanden?
Ich dachte, ein Suchquery ist so aufgebaut:
Code:
[attribute 0-n Zeichen][operator 1 Zeichen][value 0-n Zeichen]
Und folgendes Muster kann man dann mit dem Pluszeichen ('+') aneinandereihen.

Nein das ist dann wohl besser so, das mit mehreren Suchbegriffen könnte man ja auch anders lösen.

Damit aus dem zurückgegebenen Array meiner Funktion ein SQL-Query wird, musst du wiederum das Array durchgehen und dein Query-Statement aufbauen.

Also nen foreach Schleife und dann sowas wie anhängen an nen Std. SQL?

Genau, z.B. >= oder !=.
Beide sind (mit der aktuellen Version) nicht möglich.

Was müsste man da ändern?

Ich bin mal kurz weg, bis später und nochmals vielen Dank bis dato.
 
Also nen foreach Schleife und dann sowas wie anhängen an nen Std. SQL?
Ja, je nach Operator andere SQL-Konstrukte verwenden.
Am besten mit Prepared Statements arbeiten.

Was müsste man da ändern?
So einiges... Man müsste nämlich entscheiden, wann ein Operator bzw. aufhört und wann der Teil des eigentlichen Wertes (also das nach dem Operator) anfängt.

Ich hab das ganze mal gemacht und es funktioniert nun mit jedem erdenklichen Operator wunderbar: https://github.com/ComFreek/QueryConditionParser

Einfach Parser.php und ParserStrStream.php in einen Ordner packen und Parser.php in dein Skript einbinden.
Danach so aufrufen:
PHP:
Parser::parse($str);

Wenn du Syntax-Fehlermeldungen bekommst wird es höchstwahrscheinlich an einer etwas älteren PHP-Version liegen.
 
Zurück