Formularvalidator - Anregungen?

mAu

Erfahrenes Mitglied
Servus Leute,

nach längerer Zeit mal was neues von mir. Ich musste letztens für eine Seite mehrere Formulare mit teilweise mehr als 80 Eingabefeldern auswerten, da ich das etwas eleganter als mit riesigen if-else-Konstruktionen lösen wollte, habe ich mich ein bisschen umgesehen und einen recht interessanten Ansatz im Retro-Framework gefunden, leicht abgewandelt und erweitert.

Die Funktionsweise ist folgende:
Für jedes zu validierende Formular wird eine *.ini-Datei in dem Ordner /Forms abgelegt, diese ist wie folgt aufgebaut:
Code:
min-length = "Fehlermeldung, zu wenig Zeichen (mind. %2$s) für %1$s eingegeben"
max-length = "Zu viele Zeichen (max. %2$s) für %1$s eingegeben"

[formfield-name]
rule = Match:0,1 #Name der Validatorklasse, optional Parameterübergabe (hier 0 und 1)
name = "Testfeld" # Name des Testfeldes, wichtig für min- und max-length
error = "Nur 0 und 1 erlaubt"
min-length = 1
max-length = 5

[if-rule-field]
if = ":formfield-name == 1" # wird nur ausgeführt, wenn formfield-name == 1 ist
rule = Numeric
name = "If-Field"
error = "Nur Zahlen bitte"
max-length = 5
Wir haben also zwei Felder, einmal "formfield-name" und einmal "if-rule-field", welches nur überprüft wird, wenn formfield-name 1 entspricht.

Der PHP-Code zur Überprüfung sieht wie folgt aus:
PHP:
<?php
// der erste Parameter enthält die Formulardaten, in dem Fall per Post übergeben, der Zweite den Namen der INI-datei ohne Erweiterung, der dritte (optional) die Sprache der Ini-Datei
$validator = new FormValidator($_POST, 'test', 'de-DE');

$errors = $validator->validate();
if($errors->hasErrors())
    foreach($errors as $error)
        echo "{$error['message']}\n<br>";
else
    echo "Formular ist geprüft und valide";
?>
Naja, schauts euch mal an und sagt mir, was Ihr davon haltet. Seht Ihr irgendwelche Sicherheitsrisiken? Habt Ihr Fragen oder Verbesserungsvorschläge?

Danke und Grüße,
Mau
 

Anhänge

Hab in den letzten Tagen keine Zeit gehabt, aber ich denke morgen Abend werd ich mal irgendwas dazu schreiben können ;)
 
Ich überlege gerade ob es Sinn machen würde, statt Konfigurations-Dateien zu verwenden, die Regeln in eine Datenbank zu speichern.
Denn ansich finde ich das Teil toll, mich stören nur irgendwie die .ini-Dateien.
 
Oookay, ich arbeite mich mal durch ;)

FormValidator.php

Z. 57ff
PHP:
		foreach($ini as $key => $data)
		{
			if(!is_array($data) && !isset($globalErrors[$key]))
			{
				$globalErrors[$key] = $data;
			}
		}
		
		foreach($ini as $field => $cfg)
		{

Auch wenn die inhaltliche Trennung der Schleifen ok ist, würde ich aus Performance Gründen dafür stimmen die zu vereinigen?

/Rules/Numeric.php

Warum greifst du da auf langsame reguläre Ausdrücke zurück?
[phpf]is_numeric[/phpf] ist überall vorhanden oder evtl. sogar [phpf]ctype_digit[/phpf].
Dementsprechend auch bei NotNumeric.php und [phpf]is_float[/phpf] bei Float.php.

Generell finde ich, solltest du mehr auf PHP zurückgreifen und nicht alles durch reguläre Ausdrücke selber implementieren, die Filter Extension schreit gerade zu danach implementiert zu werden ;)

Und natürlich fände ich einen Wrapper für den Input eleganter, wie Loomes schon ansprach, so dass man große Änderung der eigentlichen Klassen, eine andere Quelle ansprechen kann, ob csv, Datenbank oder sonstiges könnte dann ja offen bleiben.
 
Keine schlechte Idee, allerdings ist man dann eben von einer Datenbank abhängig. Könnte man aber über eine separate Klasse auslagern, und dann eben bei bedarf über ne *.ini oder Datenbank oder sonstiges laufen lassen.

*edit: zu langsam :)

Danke für dein Feedback. Ja die Schleifen sind wohl etwas ungünstig so. Bin grad auf der Arbeit… Werd dann am Wochenende mal schauen, dass ich das Angesprochene umsetze.
 
Zurück