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

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.

Billigflüge meint dazu:

4. Juni 2008 um 13:29

Gefällt mir … nach so was suche ich schon länger. Kann man dieses Script auch leicht erweitern, um noch mehr Funktionen einzubauen?

timi meint dazu:

4. Juni 2008 um 13:44

Ja klar, das Script funktioniert nach einem einfachen Dekorator-Muster. Du kannst beliebige Prüfungen einbauen, die z.B. etwas aus einer Datenbank abgleichen…

Bragi meint dazu:

29. Juni 2008 um 07:45

Servus

Ich habe mir das mal angeschaut und für mich ein “wenig” umgewandelt.

Ich würde dir meine Version gerne zuschicken und deine Meinung dazu hören.
Ich habe den Funktionsumfang meines erachtens nach erheblich erweitert :-)

Grüße

Hans meint dazu:

10. Juli 2008 um 02:12

Servus Bragi,

dann lass doch mal deine version sehen… hört sich interessant an.

Cheers
Hans

timi meint dazu:

29. Juli 2008 um 20:29

@Hans + Bragi: Ich prüfe gerade Bragis Änderungen und entscheide, was es ins offizielle Release schafft… Sobald es ein Update gibt, gibts einen Post dazu…

marc meint dazu:

14. August 2008 um 11:55

hi

tolle sache, danke! nur das mit den fehlermeldungen neben den feldern funktioniert bei mir nicht:

$pruefung->getErrorMessage(”Vorname”);

wie genau muss ich das anstellen, damit die einzelnen fehler jeweils neben dem formularfeld erscheinen?

grüsse

michael meint dazu:

26. März 2009 um 16:02

hi,

wie kann ich denn statt den rahmen um das feld, die feldbezeichnung farbig hervorheben?

Kredite für Freiberufler meint dazu:

6. April 2009 um 19:06

Ooh, endlich habe ich es mal geschafft, die Validierung einzufügen. Das hat mich echt Ewigkeiten (und viele graue Haare) gekostet, da ich die Arbeit für einen Heimatverein machen musste, davon aber noch keine Ahnung hatte. Eine farbige Hervorhebung würde mich übrigens auch sehr interessieren.

benni meint dazu:

8. Mai 2009 um 13:35

Hey,

danke für die Bibliothek. Allerdings habe ich einen Bug bemerkt. Deine Funktion zum testen der Zahlen (intval) ist nicht sicher für größere Zahlen (z.b. Kontonummern). Ich würde lieber ein Lösung mit regulären Ausdrücken vorschlagen. Ich habe die check-Funktion der Klasse FieldNumber mal angepasst: http://gist.github.com/108748

Ringo meint dazu:

27. Juni 2009 um 22:19

Hallo,

ich arbeite mich gerade in PHP ein, und dazu muss natürlich auch eine Validierung sein.
Ich habe die Prüfungen wie beschrieben in mein Formular eingebaut, und das funktioniert soweit ganz gut. Also erstmal besten Dank für den Code.

Ich weiß nur noch nicht, wie mein Formular nach bestandener Validierung eine andere PHP-Seite aufruft, die die Verarbeitung enthält. Vorher hat mein Formular das POST an die andere Seite geschickt, das geht jetzt aber nicht mehr, weil sich das Formular immer selbst aufruft. Wie kann ich das am geschicktesten lösen?

Gruß
Ringo

Zerstoiber meint dazu:

29. Oktober 2009 um 12:00

Hallo Zusammen

ich habe die Scripte schon ein wenig länger im Einsatz und bin echt begeistert. Nur leider funktioniert bei mir die Eingabe einer PLZ beginnent mit einer 0 nicht.
Vielleicht hat ja jemand hier eine Lösung für mich. Wäre echt klasse.

Vielen Dank und weiter so

Sicheres Kontaktformular mit jQuery und PHP erstellen meint dazu:

26. Februar 2010 um 10:25

[...] Zudem “hat sich leider immer wieder herausgestellt, das es mit Javascript unmöglich ist, eine Validierung zu garantieren. Irgendwelche Trottel haben Javascript immer ausgeschaltet oder es buggt. ” [phpBlogger] [...]

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung