• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

PHP Regex: SQL Commands parsen

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
*erledigt* PHP Regex: SQL Commands parsen

Ich möchte einen simplen SQL parser schreiben, der nicht unbedingt ultradetailliert alle Optionen abdeckt, aber z.B. ne Funktion hat isSelect($sql) die TRUE zurück gibt, wenn $sql ein halbwegs korrektes SQL Statement ist.
Als BNF würde ich mir die Testsyntax so vorstellen (eckige Klammern heisst optional, geschweifte klammern heisst 0-n mal):
Code:
<select_statement>s ::=SELECT <col_names> FROM <table_name> [<where_clause>]

<col_names> ::=<name> |, <col_names>

<table_name> ::=<name> [<name>]

<where_clause> ::= <cond> | <cond> AND|OR <where_clause>

<cond> ::= <name>='<name>'

<name> ::= <all_characters>{<all_characters>}

Ich denke, die einfachste überprüfung dessen kann man mit preg_match und einem regulären ausdruck machen. Aber ich bekomme keinen funktionsfähigen Ausdruck hin.

hier was ich bisher habe:
Code:
/^SELECT\s(([^\'].+[^\'])+|\*)\sFROM\s([^\'].+[^\'])\s(WHERE\s(([^\'].+[^\'])\s?=\s?(\'.+\'))(\s(AND|OR)\s(([^\'].+[^\'])\s?=\s?(\'.+\')))*)?/i

warum ist der so komplex? ich bastel den natürlich ungefähr der BNF Formulierung oben folgend aus Variablen zusammen.

Soweit ich es herausfinden konnte ist auf jeden Fall schonmal ein Fehler am Anfang zwischen SELECT und FROM.
Im folgenden Beispiel wird das '* FROM' schon von dem in Klammern stehenden Ausdruck erfasst (warum auch immer), weshalb er das FROM danach nicht mehr findet.

Code:
Bsp SQL:
SELECT * FROM articles WHERE headline='Birth of von Neumann'

ich hab schon erfolglos damit rumgespielt, das FROM mit in den Ausdruck in die Klammer reinzunehmen (was mir aber auch schon nicht ganz passt, weil ich dann nicht allein durch den Regex die Spalten-Folge extrahieren kann.
k.A. Regex-Tuts, Google und regexp-evaluator.de konnten mir nicht weiterhelfen. Den Buddy habe ich nicht, weil ich normalerweise auf Linux oder Mac arbeite und der soweit ich weiss nur auf Windoof geht.

Bin wie immer für eure investierte Zeit dankbar und hoffe darauf, dass ihr erfolgreicher seid als ich. :)

*alle probleme gelöst*
 
Oben