Validieren von Formular-Eingaben (SDI)
Beispiele formular-validieren
Eine Übermittlung von HTML-Formular-Daten zum Server kann unerwünscht sein,
wenn bestimmte Eingaben unbrauchbar sind.
Eine Prüfung Daten kann auf der Client- oder/und der Server-Seite erfolgen.
Nachfolgend wird eine clientseitige Prüfung der Daten (ECMAScript) behandelt.
Clientseitige Prüfungen von Formular-Eingabedaten
ECMAScript aggiert vor dem Wegschicken ...
Oft sind Eingabedaten nur dann sinnvoll verwendbar,
wenn diese Daten bestimmten formalen Anforderungen genügen.
Z.B. muss eine E-Mail-Adresse zumindest das "@"-Zeichen enthalten,
eine Telefon-Nummer besteht aus Ziffern, usw.
Eine Prüfung der eingegebenen HTML-Formmular-Daten
kann auf der Client- oder/und der Server-Seite erfolgen.
Die clientseitige Formular-Prüfung vermeidet eine unnötige Netzlast,
"schont die Augen" und ist schneller (Übertragungszeit).
Auch kann z.B. der Cursor/Caret auf die fehlerhafte Eingabestelle positioniert werden.
Die clientseitige Formular-Prüfung verwendet ECMAScript (Browser)
um die Formularelement-Eingaben zu prüfen.
Z.B. kann bei einem Klick auf den submit-Button eines Formulars
zunächst onsubmit="return meine_pruefungen(this)" aufgerufen werden.
onsubmit="..." gehört in das form-Tag.
Gibt die meine_pruefungen()-Funktion false zurück,
so wird kein action = "..."-Ereignis ausgelöst,
d.h. onsubmit="return false;"
verhindert die HTTP-Übermittlung der Formulardaten zum Server.
Typisches HTML-Formular
Wie sieht ein typisches HTML-aus?
Das folgende Formular dient dazu, etwas konkretes "vor Augen" zu haben.
Durch eine Klick auf den submit-Butten werden die Formular-Daten
mit dem HTTP-POST-Protokoll an den Server übermittelt.
Vereinfacht ausgedrückt erhält der Server die zu
(name, value)
gehörenden Werte-Paare.
PHP stellt diese Werte-Paare in dem super-globalen $_POST-Array zur Verfügung.
Die durchgestrichene Zeile weist darauf hin, daß die Datenübermittlung (ohne ECMAScript)
durch den submit-Button ausgelöst wird.
Eine clientseitige Validierung braucht (ohne HTML5) ECMAScript.
Soll eine clientseitige, erfolgreiche Validierung "erzwungen" werden,
so kann die Datenübermittlung durch einen 'nicht-submit'-Button ausgelöst werden,
indem die ECMAScript-Funktion .submit() die Datenübermittlung startet.
In diesem Fall wird kein submit-Button benötigt.
Ist beim Browser ECMAScript deaktiviert, so erfolgt keine Daten-Übermittlung.
Eine Datenübermittlung kommt nur bei aktiviertem ECMAScript und erfolgreicher Validierung zustande.
<inputtype="checkbox"name="WONT_INFO"checked="checked"/> INFO
<textareaname="INFO"rows="3"cols="15"
style="width:300px!important">...</textarea>
Abschicken mit 'submit' <inputtype="submit"name="__SUBMIT"value="Submit "/>
Abschicken mit 'button' <inputtype="button"name="__SENDEN"value="Senden"/>
</pre>
</form>
onsubmit-Ereignis (form-Tag)
Wozu wird onsubmit gebraucht?
Ein form-Tag kann eine onsubmit=...-Attribut enthalten.
Ein Klick auf den submit-Button
löst (bei aktiviertem ECMAScript)
das onsubmit-Ereignis aus.
Steht im form-Tag z.B. onsubmit="return false",
so erfolgt kein Versenden der Formulardaten, d.h der Aufruf von action=... unterbleibt.
Hingegen bewirkt z.B. ein onsubmit="return true"
die nachfolgende Übermittlung der Formulardaten an die Verarbeitungsseite,
die unter
action="meine_serverseitige_verarbeitung.php">
eingetragen ist.
Code Snippet: form-Tag mit onsubmit
<formmethod="post"
enctype="multipart/form-data"
onsubmit="return validiere(this)"
action="meine_serverseitige_verarbeitung.php">
... hier sind weitere Formularelemente ...
<inputtype="submit"value="Submit"/>
</form>
Validierungsfilter (allgemein)
Wie soll validiert werden?
H. Stanley Judd: "The ultimate security is your understanding of reality."
Ziel einer Validierung ist es,
dem User Hilfestellungen für unzulässige Eingaben zu geben,
Vandalismus zu unterbinden und unzulässige Zeichen und Teilstrings zu löschen.
Es sollen lediglich zulässige Zeichen und zulässige Muster übertragen werden.
So sollte z.B.
eine eingegebene eMail-Adresse gültig sein.
Eine IP-Adresse (IPv4/IPv6) sollte gültig sein.
So kann z.B. das Entfernen von Zeichen gewünscht sein:
keine HTML-kodierte Zeichen "" < > &
keine Zeichen mit einem ASCII-Wert kleiner als 32
nur Buchstaben, Ziffern und ! # $ % & ' * +- =? ^ _ ' {|} ~ @.]
nur Buchstaben, Ziffern und $-_. +! * ' (), {} |\\ ^ ~ [] ' <> # "; /?: @ & =
So kann z.B. das Prüfen von String/Zahlen-Darstellungen und String/Zahlen-Bereichen gewünscht sein:
nur Ziffern und +-,
nur (int/float)-Zahlen aus einem vorgeschriebenen Geltungsbereich.
nur Zeichenketten mit einer min./max-Anzahl von Zeichen.
Wie kann solches realisiert werden?
Hierzu können hilfreich sein:
Reguläre Ausdrücke und benutzer-definierte Funktion zum filtern von Daten
und zum entfernen oder kodieren von Sonderzeichen.
Filter-Aufrufzuordnung (Idee)
Wie wird sowas flexibel gemacht?
Das
name-Attribut identifiziert das Eingabefeld.
Der zugeordnete name-String des Eingabefeldes
soll auch als Array-Name für die zugeordneten Filter dienen.
Dadurch ist klar, welches Eingabefeld (beim Abchicken) mit welchen Filtern geprüft wird.
Code Snippet. Prinzip des HTML-Formulares
<formname="FORM" ... >
<inputname="NAME".../>
<inputname="ORT".../>
<inputname="TEL".../>
<inputname="EMAIL".../>
<textareaname="INFO"...>...</textarea>
</form ... >
Code Snippet: Aufruf von check({...})
.check({
'NAME' :['TRIM', 'ANZ_3_99', 'HAS_KOMMA'],
'ORT' :['ANZ_3_99', 'HAS_BLANK', 'HAS_NUM'],
'TEL' :['TELEFON'],
'EMAIL':['EMAIL'],
'INFO' :['ANZ_0_9999']
});
Formular-Initialisierung (Aufruf)
Wie wird die Formular-Initialisierung gemacht?
Im Header (unter window.onload = function() { ... })
wird die folgende Formular-Initialisierung
aufgerufen:
Code Snippet: Formular-Initialisierung in window.onload = function() { ... }
validate.formular('FORM')
.colors('#efd','#fdd')
.submit_with('__SENDEN')
.check({
'NAME' :['TRIM', 'ANZ_3_99', 'HAS_KOMMA'],
'ORT' :['ANZ_3_99', 'HAS_BLANK', 'HAS_NUM'],
'TEL' :['TELEFON'],
'EMAIL':['EMAIL'],
'INFO' :['ANZ_0_9999']
});
Programmier-Beiwerk
Welche 'flankierenden' Funktionen werden gebrauch?
Beispiel: Test-Formular
Wie sieht es praktisch aus?
Dieses Formular entspricht der obigen Beschreibung.
Die Eingabetexte werden vor dem Wegschicken der Daten validiert.
Zsätzlich zur obigen Beschreibung wurde eine
CAPTCHA
-Möglichkeit eingebaut.
Erweiterung: Mehrere-Formulare je Seite
Wie geht sowas?
Das obige validiere-Objekt verwendet private Variablen.
Diese gehören zu einem Formular.
Sollen je Seite mehrere Formulare validiert werden,
so kann zum mitprotokollieren der Formulare
ein Objekt G verwendet werden, das durch
formular: function (form_nam) {
ID = document.title.replace(/([^a-zA-Z0-9_])/g, "") + "_" + form_nam;
if (!G[ID]) { G[ID] = Object.create(G.X); }
G[ID].NAME = form_nam;
NAME = form_nam;
G[ID].ID = ID;
try {
if(document.forms[G[ID].NAME].tagName.toLowerCase() === "form")
{ return this; } } catch (e1) { alert("ERR: form name='?'");
} return null;
},
kreiert wird.
Achtung! Der folgende Code ist nicht 'perfekt', sondern soll lediglich das Prinzip zeigen.
Code Snippet: Validiere mehrere Form's je Seite
var validate = (function () {
var G = { // eindeutig
"X": {
ID : null, // eindeutig aus titel und Formname
NAME : null, // = NameAttribut des aktuellen Form-Tags
CO :{} // Check, wie 'ORT':['ANZ_3_99', 'HAS_BLANK', 'HAS_NUM'],,
}
},
NAME = null, // = NameAttribut des aktuellen Form-Tags
ID = null, // eindeutig aus titel und Formname
CA = ['ENTITIFY'], // Pflicht-Transform fuer alle Elemente