Querdenkender Webworker mit WordPress-Affinität

checkdate() defekt?

Ob das nun ein Bug oder Feature ist … das ist nicht klar! Ich – für meinen Teil – würde wieder mal von einer automagischen Funktion sprechen, mit der uns das PHP-Entwickler-Team da beglückt hat. checkdate() erwartet 3 INT-Parameter. Natürlich wieder in der Reihenfolge Monat, Tag, Jahr – um diesen potentiellen Verschreiberling schon mal im Vorfeld anzusprechen. Falls man Strings an die Funktion übergibt, werden diese automatisch gecastet, was dazu führt, dass aus einem „2ba7“ magischerweise eine 2 wird und uns checkdate() TRUE liefert. PHP wird nur einen E_NOTICE werfen, was bei den meisten Einstellungen für das PHP-Error-Reporting nicht weiter auffällt.

Allerdings kann man mit Hilfe anderer Funktionen die Gültigkeit einer Datumseingabe in einem Formular tatsächlich viel einfacher prüfen. Normalerweise kommt ein Datum (z.B. aus einem Webformular) je nach Sprache in einem bestimmten Format an. Soll dieser Wert weiterverwendet werden, ist die Prüfung natürlich Pflicht. PHP geht mit einem Datum auch recht lässig um, wenn man Funktionen wie mktime() oder date() bzw. Konstrukte daraus verwendet. So wird aus dem 32.12.2006 schon mal ganz schnell der 01.01.2007 usw.

Wenn man das Verhalten aber verhindern will, ohne sich das Leben mit regulären Ausdruecken zu erschweren, bietet sich für die Prüfung einer deutschen Datumsangabe folgende Lösung an:

[code lang=“php“]
function mycheckdate ($str) {
$temp = split („[.]“, $str);
if (count ($temp) == 3 && $str == date („d.m.Y“, mktime (0, 0, 0, $temp[1], $temp[0], $temp[2]))) {
return TRUE;
}
return FALSE;
}
[/code]

Ich würde diese Funktion auch nicht weiter generalisieren. Sollte der Bedarf bestehen, das Datum für andere Sprachen zu prüfen, sollte man diese Funktion als Methode in Klassen implementieren, deren Objekte durch die Fabrikmethode erzeugt werden. Ansonsten ist es Aufgabe des Programms, bei Aufruf der Funktion zu prüfen, ob da ein String existiert, den es zu ueberprüfen gilt. Die Funktion selbst wird das Datum zerlegen und prüfen, ob nun 3 Werte vorliegen. Ist dies der Fall, werden diese Werte an date(mktime()) übergeben und dann mit der ursprünglichen Eingabe verglichen. Bei Erfolg liefert mycheckdate() dann TRUE, womit sich dann folgendes realisieren lässt:

[code lang=“php“]
// gibt aus: OK
echo check (‚31.12.2006‘) ? ‚OK‘:’Nicht OK!‘;
// gibt aus: Nicht OK
echo check (‚32.12.2006‘) ? ‚OK‘:’Nicht OK!‘;
// gibt aus: Nicht OK
echo check (‚31.12.‘) ? ‚OK‘:’Nicht OK!‘;
// gibt aus: Nicht OK
echo check (‚01.06.2ba7‘) ? ‚OK‘:’Nicht OK!‘;
[/code]

Der hier vorgestellte Code wurde von mir im phpforum ebenfalls gepostet. Allerdings waren meine Ausführungen eher kurz. 😉

Have fun!

Das könnte Dich auch interessieren:

Kommentare

  1. Stefan R. meint:

    return $d<=$x[$m-1]

    Ich kommentiere ja kaum Blogs, aber das scheint ein Fehler in WP zu sein. Die letzte Zeile ist immer unvollständig.

  2. Stefan R. meint:

    function checkdate($d,$m,$y){
      $x=array(31,28,31,30,31,30,31,31,30,31,30,31);
      $x[1]+=!($y%4)&&($y%100)||!($y%400);
      return $d<=$x[$m-1];
    }

    Formular für Datumsangaben? Warum keine Select-Boxen?

  3. Ich hab‘ Deinen Code mal mit den notwendigen Tags versehen …

Deine Meinung ist uns wichtig

*