- 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):
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:
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.
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*
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*