10.4 Validate 

Das Paket PHP_Validate ist eine Art Schweizer Messer zum Überprüfen von allen möglichen Werten. Primär ist es Aufgabe des Pakets, Zahlenwerte wie Kreditkarten- oder ISBN-Nummern zu überprüfen, da diese oft eine Prüfziffer enthalten. Des Weiteren können auch Texte wie E-Mail-Adressen geprüft werden, die nach einem bestimmten festgelegten Schema aufgebaut sind.
Hierbei sollten Sie immer im Hinterkopf haben, dass eine gültige Kreditkartennummer nicht unbedingt auch existieren muss. Das Paket kann nur prüfen, ob die Daten gültig sein könnten, also in sich konsistent sind, nicht aber, ob sie das auch wirklich sind.
Die meisten Funktionen im Paket sind statisch definiert, so dass es nicht notwendig ist, ein Objekt zu instanziieren. Prüffunktionen, die allgemein gültig sind, sind in der Datei PHP/Validate.php definiert. Landesspezifische Prüfungen sind in den Dateien im Unterverzeichnis PHP/Validate/ zu finden. Die landesspezifischen Dateien haben alle einen unterschiedlichen Leistungsumfang. Teilweise werden Sozialversicherungsnummern geprüft, teilweise sind es Postleitzahlen oder Bankleitzahlen.
Um zu prüfen, um ob eine Variable einen String oder eine Zahl enthält, sind die beiden Methoden string() und number() vorgesehen, die – wie die anderen Methoden auch – einen booleschen Wert als Ergebnis liefern. string() bekommt als ersten Parameter die zu testende Variable übergeben. Der zweite Parameter ist ein Array mit Optionen, die definieren, nach welchem Schema der Variableninhalt zu testen ist. Der Schlüssel 'format' definiert, nach welchem Schema der Inhalt aufgebaut sein darf. Hierzu sind die Konstanten aus Tabelle 10.2 definiert.
Diese Konstanten können auch miteinander kombiniert werden, indem Sie sie mit dem String-Verbindungsoperator (Punkt-Operator) miteinander verknüpfen.
Des Weiteren können Sie in dem Array die Schlüssel 'min_length' und 'max_length' mit Werten belegen, die die minimal erforderliche und die maximal akzeptable Stringlänge definieren.
Mit number() ist es möglich, eine Variable darauf zu testen, ob sie eine Zahl enthält, die einer bestimmten Vorgabe entspricht. Auch hier wird die zu prüfende Variable als Erstes übergeben. Optional kann ein zweiter Parameter genutzt werden, mit dem Sie auch hier festlegen können, welchem Schema die Zahl entsprechen soll. Das Array, das hier genutzt werden kann, unterstützt die Schlüssel 'decimal', 'dec_prec', 'min' und 'max'. Mit dem ersten können Sie Zeichen übergeben, die in der Zahl enthalten sein dürfen. Mit dem String '.,' würden Sie den Punkt und das Komma als zulässig deklarieren. 'dec_prec' legt fest, aus wie vielen Ziffern die Zahl bestehen darf, und die beiden anderen Schlüssel geben Ihnen die Möglichkeit, einen minimal erforderlichen bzw. einen maximal zulässigen Wert zu deklarieren.
Sehr hilfreich ist auch die Methode date(), die die Gültigkeit eines Datums testen kann. Auch hierbei wird die Variable mit dem potenziellen Datum an erster Stelle übergeben. Da die Methode nicht selbstständig erkennen kann, was Tag, Monat oder Jahr sein soll, müssen Sie diese Information mit dem zweiten Parameter bereitstellen. Der zweite Parameter ist ein Array, bei dem mit dem Schlüssel 'format' der Formatbeschreiber des Datums übergeben wird. Dieser ist nach demselben Schema aufzubauen, das für die PHP-Funktion strftime() definiert ist. Der Schlüssel 'min' legt eine Untergrenze und der Schlüssel 'max' legt eine Obergrenze fest.
Mit diesem Array würde also definiert, dass das übergebene Datum sich aus Tag, Monat und Jahr, getrennt durch Punkte, zusammensetzen muss und zwischen dem ersten Januar 2005 und dem 31. Dezember 2006 liegen muss.
Um die Gültigkeit einer E-Mail-Adresse zu prüfen, ist die Methode email() vorgesehen.
require_once('Validate.php'); $mail="cmoehrke@netviser.de"; if (true===Validate::email($mail)) { echo 'Die Adresse ist gültig'; } else { echo 'Die Adresse ist ungültig'; }
Listing 10.4 Überprüfen einer E-Mail-Adresse mit PEAR::Validate
Die Methode email() akzeptiert übrigens noch einen zweiten, booleschen Parameter. Übergeben Sie ein logisches Wahr, so wird auch gleich die Existenz der Domain geprüft, was allerdings nur dann funktionieren kann, wenn der Rechner, auf dem das Script ausgeführt wird, Zugang zum Internet hat.
Zum Überprüfen einer URI ist die Methode uri() vorgesehen. Diese bekommt als ersten Parameter den String übergeben, der daraufhin geprüft werden soll, ob er eine gültige URI nach RFC 2396 [Der komplette RFC ist unter http://www.faqs.org/rfcs/rfc2396.html zu finden. ] darstellt. Der zweite, optionale Parameter definiert, wie geprüft werden soll. Hierzu wird ein Array genutzt, das die Schlüssel 'domain_check' und 'allowed_schemes' unterstützt. Mit dem ersten können Sie auf Basis eines booleschen Wertes festlegen, ob die Existenz der Domain geprüft werden soll. Der zweite Schlüssel kann auf ein Array verweisen, in dem die unterstützten Schemata bzw. Protokolle definiert sind. Übergeben Sie hiermit die Strings 'http' und 'ftp', so werden nur URIs mit diesen Protokollen akzeptiert.
Darüber hinaus sind einige Funktionen definiert, um spezielle Zahlen auf Gültigkeit zu testen. Die Methoden aus Tabelle 10.3 bekommen alle nur einen Wert übergeben und liefern einen booleschen Wert zurück.
Einige weitere allgemein gültige Funktionen sind in der Datei Validate/Finance.php definiert. Zwar sind momentan nur zwei Methoden definiert, aber ich hoffe, dass sich hier in Zukunft noch ein paar weitere Funktionen finden werden.
Die erste Methode heißt banknoteEuro(). Sie dient dazu, die Gültigkeit der Nummer eines Euro-Geldscheins zu prüfen, die als Parameter übergeben wird. Wichtig dabei ist, dass die übergebene Nummer kein Leerzeichen enthalten darf, was häufig genutzt wird, um den Anfangsbuchstaben von der eigentlichen Nummer zu trennen.
require_once('Validate/Finance.php'); // $nummer kommt normalerweise aus einem Formular $nummer='X 00768169352'; // Leerzeichen eliminieren $nummer=str_replace(' ','',$nummer); if (true === Validate_Finance::banknoteEuro($nummer)) { echo 'Nummer ist korrekt'; } else { echo 'Nummer ist nicht korrekt'; }
Listing 10.5 Prüfen einer Banknotennummer mit PEAR::Validate
Die zweite Methode ist iban(). Mit ihr können Sie eine »International Bank Account Number« auf Gültigkeit prüfen. Auch sie bekommt den zu prüfenden Wert als Parameter übergeben, wobei Sie beachten sollten, dass auch hier keine Leerzeichen zur Abtrennung innerhalb der IBAN zulässig sind. Zur Prüfung gibt es zwei Ansätze. Nutzen Sie die Methode statisch, liefert sie nur ein true oder ein false.
require_once('Validate/Finance.php'); // IBAN kommt normalerweise aus einem Formular $iban='DE32 2508 0020 0113 0900 00'; $iban=str_replace(' ','',$iban); $res=Validate_Finance::iban($iban); if (true === $res) { echo 'IBAN ist korrekt'; } else { echo 'IBAN ist nicht korrekt'; }
Listing 10.6 Prüfung einer IBAN mit statischem Aufruf
Sie haben alternativ auch die Möglichkeit, mit einem Validate_Finance_IBAN-Objekt zu arbeiten. Das hat den Vorteil, dass Sie mehr Informationen darüber erhalten können, welcher Fehler bei der Prüfung festgestellt wurde.
require_once('PEAR.php'); require_once('Validate/Finance/IBAN.php'); $iban='DE32 2508 0020 0113 0900 00'; $iban=str_replace(' ','',$iban); $val=new Validate_Finance_IBAN($iban); $res = $val->validate(); if (true===PEAR::isError($res)) { die ($res->getMessage()); } if (true === $res) { echo 'IBAN ist korrekt'; } else { $fehler=array( VALIDATE_FINANCE_IBAN_ERROR => 'Unbekannter Fehler', VALIDATE_FINANCE_IBAN_GENERAL_INVALID => 'IBAN ungültig', VALIDATE_FINANCE_IBAN_TOO_SHORT => 'IBAN zu kurz', VALIDATE_FINANCE_IBAN_TOO_LONG => 'IBAN zu lang', VALIDATE_FINANCE_IBAN_COUNTRY_INVALID => 'IBAN-Landescode ist ungültig', VALIDATE_FINANCE_IBAN_INVALID_FORMAT => 'IBAN hat ein ungültiges Format', VALIDATE_FINANCE_IBAN_CHECKSUM_INVALID => 'IBAN hat eine ungültige Prüfsumme' ); $code=$val->getErrorcode(); echo "IBAN ist nicht korrekt<br />Grund: $fehler[$code]";
Listing 10.7 Prüfung einer IBAN
Um ein Objekt zu instanziieren, müssen Sie die Datei Validate/ Finance/IBAN.php einbinden.
Im Abschnitt über die Fehlerbehandlung konnten Sie schon erkennen, dass verschiedene Konstanten definiert sind, mit denen das Objekt Ihnen mitteilen kann, welcher Fehler aufgetreten ist. Für das Auslesen des Fehlercodes ist die Methode getErrorcode() zuständig.
Wie schon erwähnt wurde, sind darüber hinaus unterschiedlichste Methoden für landesspezifische Überprüfungen vorgesehen. Ich werde hier nur auf die Funktionalitäten für Deutschland, Österreich und die Schweiz eingehen.
Für Deutschland ist die Datei Validate/DE.php zuständig. Diese definiert die statischen Methoden bankcode() und postcode(), mit denen eine Bankleitzahl und Postleitzahl geprüft werden können:
require_once('Validate/DE.php'); $plz='33619'; if (true==Validate_DE::postcode($plz)) { echo 'Die PLZ ist korrekt'; } else { echo 'Die PLZ ist nicht korrekt'; }
Listing 10.8 Prüfen einer deutschen Postleitzahl
Bitte beachten Sie hierbei, dass diese Methoden immer in landesspezifischen Klassen definiert sind: für Deutschland also Validate_DE, für Österreich Validate_AT und so weiter. Des Weiteren liefern die »deutschen Methoden« keinen booleschen Wert, sondern einen Integer-Wert zurück, so dass Sie mit == und nicht mit === arbeiten sollten.
Gleiches gilt für die Methode zum Prüfen von österreichischen Postleitzahlen, die auch postcode() heißt und in der Datei Validate/AT.php definiert ist. Diese bietet darüber hinaus aber noch die Möglichkeit, mit einem true als zweitem Parameter zu prüfen, ob diese Postleitzahl auch existiert. Im ersten Fall wird nur geprüft, ob der String aus exakt vier Ziffern besteht. Im zweiten Fall wird auf Basis einer Liste von existierenden Postleitzahlen geprüft, ob die Zahl korrekt ist.
Die zweite für Österreich definierte Methode ist ssn(), mit der eine Sozialversicherungsnummer geprüft werden kann.
Diese beiden Methoden sind mit identischem Verhalten auch in der Datei Validate/CH.php für die Schweiz definiert. Zusätzlich ist in diesem Fall noch die Methode studentid() vorhanden, die eine Immatrikulationsnummer einer Schweizer Universität prüfen kann.
Um herauszufinden, welche Funktionalitäten für die anderen Länder definiert sind, möchte ich Sie auf die Online-Dokumentation unter http://pear.php. net/package/Validate/docs verweisen, da die Besprechung aller Länder hier den Rahmen sprengen würde.