PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Formularinhalte mit PHP validieren

Im Downloadbereich habe ich bereits eine Bibliothek zum Validieren von Formularen verlinkt. Es handelt sich um jsVal, eine kleine Datei mit großer Wirkung :) Leider hat sich immer wieder herausgestellt, das es mit Javascript unmöglich ist, eine Validierung zu garantieren. Irgendwelche Trottel haben Javascript immer ausgeschaltet oder es buggt. Naja.

Wohl oder über muss man die Validierung von Formularen dann mit PHP machen. Und das ist keine angenehme Sache: Eine Seite mit Formular, eine PHP Seite mit Formularhandler und Validierung, eine andere für die obligatorische Dankeschön-Seite. Irgendwelche undurchschaubaren If- und  Regex-Ausdrücke und vieles mehr tummeln sich dort.

Abgesehen von der nahezu grenzenlosen Unübersichtlichkeit (Gerade bei großen Formularen) ist der größte Feind die Implementierung: Hat man auf einer Website mehrere Formulare (und das ist ja in der Regel so), muss man die Validierung für jedes Formular extra bauen. Na toll, Copy&Paste lässt grüßen.

phpValidierung

Zeit für eine Bibliothek, die die Welt verändert! Zeit für eine total einfach einsetzbare Bibliothek. Grenzenlos erweiterbar und trotzdem individuell: Der Traum eines jeden Programmierers ;-) Wer weiterliest, bekommt als Dankeschön einen Downloadlink nebst Anleitung…

Das Prinzip ist zunächst einfach erklärt: Man schickt das Formular an eine Seite, die es validiert (Kann auch die selbe sein, die das Formular enthält). Für die Validierung erstellt man ein Prüfungsobjekt:

$pruefung= new FormValidation("formular");

Das Prüfungsobjekt wird mit Regeln bestückt. Pro Regel muss man zunächst unterscheiden zwischen optionalen und Muss-Feldern. Dann den Prüfungstype festlegen und eine Fehlermeldung vergeben:

$pruefung->requireField(
  "PLZ",
  new FieldZipCode(),
  "Bitte eine PLZ eingeben."
);

Übrigens, diese Prüfungen kann man beliebig kombinieren. Einfach nacheinander angeben… Danach noch die Prüfung ausführen:

$ergebnis= $pruefung->check();

Wenn die Prüfung erfolgreich war (true, keine Fehler sind aufgetreten), kann das Formular weiterverarbeitet werden. Andernfalls gibt man die Fehlermeldungen aus:

$pruefung->echoErrorMessages();

Und danach die CSS-Regeln für die zu highlightenden Formularfelder:

$pruefung->echoErrorStyles();

Alles natürlich schön XHTML und CSS kompatibel. Die CSS-Regeln können total unproblematisch überschrieben werden.

Damit die Prüfungen möglichst einfach erweitert und an die eigene Applikation angepasst werden können, sind diese als eigene Objekte realisiert. Der Konstruktor ist komplett frei wählbar. Das hat den Vorteil, das alle Prüfungen frei parametrisiert werden können. Im Klartext: man kann beliebige Formularvalidierungen damit bauen sogar die Datenbank abzugleichen ist kein Problem. Eigene Datentypen? Auch kein Ding. Trotzdem updatefähig? Na klar :)

Folgende Prüfungen sind standardmäßig mit dabei:

  • Mit irgendwas gefüllt (FieldFilled)
    Egal was drin steht, es wird alles akzeptiert, solange es keine Steuerzeichen und Whitespaces sind.
  • Begrenzung der Zeichenanzahl (FieldLength)
    Für die Zeichenanzahl können Minimal- und Maximalwerte bestimmt werden.
  • Nummer (FieldNumber)
    Eine Zahl aus einem frei wählbaren Bereich wird akzeptiert, Minimal und Maximalwerte können im Konstruktor angegeben werden.
  • Benutzername (FieldUsername)
    Nur Buchstaben, Zahlen und _ werden akzeptiert, prima kombinierbar mit der Zeichenanzahl.
  • Postleitzahl (FieldZipCode)
    Die Länge der Postleitzahl kann mittels Minimal- und Maximalwerten frei definiert werden. Hier sind nur Zahlen zulässig, UK Zip Codes funktionieren also nicht.
  • Emailadresse (FieldEmail)
    Ganz klar, eine Emailadresse wie man sie kennt, ist zugelassen.

Jetzt noch der Download der Dateien + Beispiel:
http://www.phpblogger.net/download/phpValidierung.zip

Teile und genieße Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

rtauchnitz meint dazu:

9. Juli 2007 um 17:29

Nett… Habe es mir jetzt nicht genauer angeguckt, aber schaut interessant aus. Wie sieht es lizenztechnisch aus?

timi meint dazu:

9. Juli 2007 um 17:46

Ach stimmt, ich habs unter gar keien Lizenz gestellt… Wird der LGPL zugeordnet. Jeder darfs verwenden :)

Ich aktualisiere demnächst das Archiv.

tim meint dazu:

9. Juli 2007 um 18:09

Hättest du mir das mal früher gesagt, dass du sowas programmiert hast :)
Gestern habe ich eine ähnliche Klasse geschrieben. Die Klasse ist sehr simpel gehalten und wird nur zur “Absicherung” verwendet, falls jemand JavaScript deaktiviert hat, oder versucht die Webseite zu “hacken”. Die JavaScript Überprüfung wird über jQuery und einem Formularvalidierungsplugin durchgeführt.

tim meint dazu:

9. Juli 2007 um 18:13

Leider sind Teile des Source-Codes gelöscht worden und die Formatierung ist verloren gegangen. Ich habe sie nochmal bei pastebin.ca gepostet:
http://pastebin.ca/610685

timi meint dazu:

9. Juli 2007 um 19:59

Hallo Tim,

ich habe die übrig gebliebenen Codefetzen aus Deinem Beitrag entfernt - da sowieso nur die Hälfte übernommen wurde, macht das ja keinen großen Unterschied.

Die Implementierung Deiner Klasse ist gelungen. Sehr praktisch ist natürlich die Kontrolle der MX-Server bei der Emailadresse. Auch eine Domain-Prüfung fehlt bei meiner Lib noch.

Leider hast Du keinen einzigen Kommentar eingebaut, das macht das ganze ziemlich unübersichtlich - ein Beispiel eines praktischen Einsatzes machts noch einfacher. Schau Dir mal meine Implementierung an, da sind jede Menge PhpDoc-Kommentare drin, vielleicht wär das ja auch was für Dich?

Der Vorteil bei der Implementierung, die ich vorgestellt habe, ist das die Prüfungen in einzelne Objekte/Klassen gekapselt sind. So ist es super easy, eigene Prüfungen einzubauen.

Vielleicht hast Du ja eine Idee, mit welchen Prüfungsobjekten man das Validation-Framework noch erweitern könnte und baust welche? Wenn die Implementierung gut ist, ergänze ich gerne das Main-Release…

Beste Grüße

Tim :)

tim meint dazu:

10. Juli 2007 um 16:49

Da hier Formatierungen gelöscht werden und der Code nicht highlighted wird, habe ich hier die Antwort gepostet: http://pastebin.ca/612623

Gruß
Tim

phpblogger.net: Formularvalidierung mit Javascript? - Der frische PHP Blog meint dazu:

9. Oktober 2007 um 10:08

[…] leichtes, eine Formularvalidierung mit Javascript zu implementieren (Im Juli hatte ich die kleine Bibliothek JSval vorgestellt). Beim Ajaxian hab ich grad von dem neuen Projekt JSValidate gelesen, das vom Prinzip […]

Dominik meint dazu:

4. Mai 2008 um 12:54

Nettes Script. Frage mich allerdings, ob die Fehler auch einzeln und direkt neben einem Feld erscheinen können (z.B. in einer Spalte neben dem Formularfeld, was natürlich bei der Erstellung des Formulars berücksichtigt werden müsste.) Wenn die Fehler einzeln augegeben werden können, wie würde man das bewerkstelligen?
Vielen Dank im Voraus.
Gruß,
Dominik

timi meint dazu:

5. Mai 2008 um 13:49

Hi Dominik,

Du kannst Dir Fehlermeldungen zu einzelnen Formular-Feldern mit der Funktion getErrorMessage(”FELD_ID”) zurückliefern lassen. FELD_ID natürlich durch den Namen des entsprechenden Feldes ersetzen und schon klappts. Die Funktion liefert einen Leerstring zurück, wenn keine Fehlermeldung zum Feld existiert.

Ein Beispiel:
$pruefung->getErrorMessage(”Vorname”);

Billigflug meint dazu:

7. Mai 2008 um 17:11

Na super! Wenn ich diesen Blog früher gesehen hätte…
So gesehen habe ich das Rad noch mal erfunden :)

timi meint dazu:

7. Mai 2008 um 17:14

Ich fass das mal als Kompliment auf ;) Wer zu spät kommt, den betraft halt das Leben *zwinker*

Typo3-Agentur meint dazu:

19. Mai 2008 um 09:22

Danke für diesen genialen Beitrag. Ohne vernünftige Validierung darf man kein Formular heute noch ins Netz stellen.

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung