Wie im letzten Eintrag angekündigt: Hier der zweite Post zum Thema „Validierung“. Heute steht die Serverseitige Validierung mit PHP im Mittelpunkt.

Im Gegensatz zu Javascript gibt es bei PHP einige vorgefertigte Funktionen welche uns Entwicklern das Leben erleichtern. Während wir z.B. bei Javascript einen eigenen RegEx Code benötigen um eine E-Mail-Adresse zu validieren, so liefert uns PHP eine vorgefertigte Funktion namens filter_var mit der sich eine ganze Reihe von Validationen erstellen lassen.

Es existiert ein Unterschied zwischen „Validation“ und „Filterung“ – Bei der Validation wird geprüft ob ein bestimmter Wert einem Muster (Integer Zahl, E-Mail-Adresse, …) entspricht. Das Ergebnis ist in der Regel Boolesch „wahr“ oder „falsch“, dabei wird der zu prüfende Wert nicht verändert. Die Filterung hingegen verändert den original Wert, sofern dieser nicht den Vorgaben entspricht. Ein Beispiel dazu findet ihr in meinem Posting zum Thema SQL-Injection (Funktion „mysql_real_escape_string()“)

Behalten wir diese Beschreibung im Hinterkopf und sehen uns den Namen „filter_var“ an, müssten wir also eigentlich annehmen das wir hier nichts validieren – Das ist teilweise richtig. Denn sollte der übergebene Wert nicht validiert (oder eben gefiltert) werden können wird von der Funktion Boolesch „Falsch“ zurückgegeben. Für unsere Zwecke ist dieses Verhalten absolut ausreichend.

Der filter_var Funktion können wir eine beliebige Variable übergeben und anschließend mit Hilfe von verschiedenen Parametern genau steuern was validiert werden soll – Wollen wir nun Beispielsweise eine E-Mail-Adresse auf ihre Richtigkeit prüfen so können wir das folgendermaßen tun:

$email = filter_var('post@leonardfischer.de', FILTER_VALIDATE_EMAIL);

Im Falle der korrekten Filterung wird der gefilterte String zurück gegeben, andernfalls Boolesch „falsch“.

Einfach, oder? Übrigens gibt es auch eine ähnliche Funktion um direkt auf die GET, POST, COOKIE, SERVER und ENV Daten zuzugreifen: filter_input (SESSION und REQUEST sind laut php.net noch nicht implementiert, folgen aber).

Die beiden Funktionen gibt es auch in Versionen die direkt mehrere Elemente (via Array) validieren: filter_var_array und filter_input_array.

Natürlich ist es noch interessant zu wissen was alles validiert werden kann – Wie im Beispiel oben gesehen gibt es entsprechend definierte Konstanten, die ihr euch hier ansehen könnt. Um das mal zusammen zu fassen: Es gibt Konstanten für das validieren von Integer- und Float Zahlen, Booleschen Werten, E-Mail-Adressen, URLs, IP-adressen (IPv4 und IPv6) und RegEx Codes – Unter dem Link findet ihr auch eine Reihe an kompatiblen Optionen, die ihr den Funktionen übergeben könnt.

Diese lassen sich in einem assoziativen Array mitgeben, um eure Validation noch zu verfeinern:

$num = filter_var(
   $number, 
   FILTER_VALIDATE_INT, 
   array('options' => 
      array('min_range' => 1, 'max_range' => 100)));

Hier wird eine Ganzzahl validiert, deren Wert zwischen 1 und 100 liegen muss

Neben den filter_* Funktionen gibt es noch einige weitere Funktionen die uns Hilfreich sein können – Unter anderem gäbe es is_int(), is_bool(), is_array() und einige weitere mit denen sich Variablen-Typen prüfen lassen!

Es gibt übrigens noch einen netten kleinen Trick um eine Datumseingabe (als String) ohne großen Aufwand zu prüfen:

/**
 * Testet ob der String ein valides Datum enthält.
 *
 * @param   string   Das zu prüfende Datum
 * @return  boolean
 */
function is_date($str)
{
   return (strtotime($str) !== FALSE);
}

(Gefunden im Quellcode des Kohana Framework)

Für die meisten „spezielleren“ Validierungen wird dann wahrscheinlich auch wieder ein RegEx Code benötigt. Solltet ihr jedoch tatsächlich eine Validierung benötigen zu der es keine vorgefertigte Funktion gibt und die zu komplex für einen RegEx Code ist bietet es sich natürlich an eine eigene Funktion zu schreiben.

Für den Fall das ihr ein Framework benutzt (das keine Validation mitbringt) könnt ihr euch natürlich auch, wie im letzten Post vorgeschlagen, nach Plugins umsehen oder Fremdbibliotheken einbinden. Das gestaltet sich bei PHP aber evtl. komplizierter als bei Javascript: Es ist gut möglich das runtergeladene Fremdbibliotheken eigene Autoloader mitbringen die erst in euer Framework „reingebastelt“ werden müssen – Normalerweise bringen Frameworks aber ein sogenanntes „lib“ oder „vendor“ Verzeichnis mit, das vom eigenen Autoloader unangetastet bleibt.
Das ist aber nicht mein Heutiges Thema 😉

Das Thema „Autoloading“ wird dann Thema im nächsten Blogeintrag.

Über Kommentare und Anmerkungen freue ich mich natürlich!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.