Per Regex(?) Tabellennamen auf Gültigkeit prüfen
Auge
- datenbank
0 Auge0 Christian Kruse0 Auge0 Christian Kruse0 Auge
Hallo
Ich habe für ein PHP-Skript eine Installationsroutine erstellt. Dort sollen Angaben, wie Datenbankname, Passwort, die Namen der Tabellen sowie einige andere Dinge eingegeben werden. Daraufhin werden die Tabellen erstellt und einige andere Angaben in einer "settings.php" abgespeichert.
Nun bin ich dabei die Prüfung, ob die vom Formular übergebenen Werte gültig sind, zu programmieren. Ich habe mir Angaben zu Namenskonventionen für SQL-Datenbanken rausgesucht.
<zitat>
Datenbanknamen dürfen aus Buchstaben, Ziffern (nicht am Anfang) und der Zeichenmenge = {@, #, _, $} bestehen, keine Leer- und max. 18 Zeichen (enthalten).
</zitat>
Die gleichen Konventionen gelten nach den Angaben auf dieser Seite für Tabellen. Nun sind einerseits diese Angaben allgemein auf SQL Datenbanken bezogen, was mich fragen lässt, ob dies so explizit auch für MySQL gilt. Außerdem stellt sich mir die Frage, wie ich den vom Formular übergebenen Wert mit einem regulären Ausdruck zu fassen kriege oder ob ich die Prüfung besser auf anderem Weg vornehme. Der Name kann ja sonstwie aussehen. Er scheint mit einem Buchstaben beginnen zu müssen. Wo dann aber die anderen Zeichen stehen, steht in den Sternen. Wie _ich_ einen Tabellennamen aufbaue, weiß ich, was ein anderer Benutzer des Skriptes bei der Eingabe der Namen tut, weiß ich nicht.
Für mich einfacher wäre es, jede Eingabe zuzulassen, mit mysql_escape_string zu behandeln, und den Anwender im Fehlerfall mit der Fehlermeldung des DB-Servers zu konfrontieren, eigentlich aber "allein zu lassen". Das kann es meiner Meinung nach aber auch nicht sein.
Tschö, Auge
Hallo
Ich habe es mit:
preg_match("/[1]{1}[a-zA-Z0-9@\_#$]{1,17}$/",$db_name)
probiert, glaube aber nicht, dass der Ausdruck alle möglichen Fälle abdeckt. Darf ein DB- oder Tabellenname überhaupt nur aus einem Buchstaben bestehen? Muss das letzte Zeichen irgendwelchen Konventionen entsprechen ( z.B. [a-zA-Z0-9])?
Tschö, Auge (sich langsam an das Problem herantastend)
a-zA-Z ↩︎
Hallo
preg_match("/[1]{1}[a-zA-Z0-9@\_#$]{1,17}$/",$db_name)
Besser (da lesbarer):
preg_match("/[2][a-z0-9@_#$]{,17}$/i",$db_name)
Das deckt alle Faelle in der Beschreibung ab.
Nach kurzem rumprobieren funktionierte es nur so:
preg_match("/[3][a-z0-9@_#$]{1,17}$/i",$db_name)
Der Backslash vor dem letzten "$" (ich vermute mal "Einmal zu viel maskiert") als auch {,17} wollte nicht funktionieren. Letzteres bringt aber wieder das Problem des nicht funktionierenden "Einzeichennamens" mit sich.
Das soll mich aber nicht wirklich stören. Ich glaube kaum, dass ein Hoster die dem Kunden zur Verfügung gestellte Datenbank mit nur einem Zeichen benamst. Und die Tabellennamen, die ja dem gleichen Namensschema folgen, bekommen im Formular sprechende Namensvorschläge mit einem Präfix, um eventuellen Namenskonflikten mit bereits bestehenden Tabellen aus dem Weg zu gehen.
Vielleicht ist es sinnvoller, nur den Präfix zur freien Wahl zu stellen und den sprechenden Teil des Namens fest vorzugeben. Oder ist dies eher eine Bevormundung des Anwenders?
*btw* Was bewirkt das "i" am Ende des Ausdrucks ("$/i")? Case _I_nsensitive?
Tschö, Auge
Hallo Auge,
preg_match("/[1][a-z0-9@_#$]{1,17}$/i",$db_name)
Der Backslash vor dem letzten "$" (ich vermute mal "Einmal zu viel
maskiert")
Ja, das war ein Fluechtigkeitsfehler.
als auch {,17} wollte nicht funktionieren. Letzteres bringt aber wieder
das Problem des nicht funktionierenden "Einzeichennamens" mit sich.
Es muss {0,17} heissen :)
*btw* Was bewirkt das "i" am Ende des Ausdrucks ("$/i")? Case
_I_nsensitive?
Korrekt.
Grüße,
CK
a-z@_#$ ↩︎
Hallo Christian
- Fluechtigkeitsfehler.
- Es muss {0,17} heissen :)
- Korrekt.
Dann dank' ich auch recht schön.
Tschö, Auge