PHP Prüfung mit flexibler Abhängigkeit

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.480
Hallo Leute, ich habe da mal eine kleine Frage an Euch bezüglich einer flexiblen Abhängigkeit :)

Da ich nicht genau weiß, wie ich das Problem beschreiben soll oder nach was man da am besten sucht, fange ich mal an die Thematik oder meine Vorstellung zu beschreiben :)

Ich habe in einer Eingabemaske ein Datum Feld, was mit checkdate(); überprüft wird, ob es dieses Datum gibt. Ist das erledigt, wird überprüft ob dieses Datum in der Vergangenheit liegt (hier wäre ein Fehler), oder bei einem Geburtstag ob dieser in der Zukunft liegt (hier wäre ein Fehler).

Nun habe ich zwei Eingabefelder (Anfang und Ende)
- es werden beide Felder auf Echtheit geprüft
-- richtig = es geprüft ob Anfang in der Vergangenheit liegt
--- richtig = es wird geprüft ob ende vor Anfang liegt
---- richtig = es wird der Abstand der Daten geprüft

Genauso bei einem Geburtsdatum,
- es wird auf Echtheit geprüft
-- richtig = es wird das Alter vom heutigen Tag geprüft

Ich hoffe man versteht durch meine Bindestriche ein wenig den Aufbau. Es handelt sich dabei um verschachtelte IF / ELSE Abfragen. Nun wollte ich gerne wissen, ob es möglich ist diese Abhängigkeiten in eine Methode / Funktion zu bringen, aber so das man nach belieben eine Prüfung raus nahmen oder wieder einsetzen (oder dazwischen setzen) kann.

Hoffentlich konnte ich das ganze etwas genauer erklären, und man kann mir mal einen Ansatz geben wie ich das schöner machen kann. Ich habe diverse Abfragen etc. schon in Methoden meiner Klasse gebaut, nur die Funktion für die Datum-Felder sind so ein super Knoten. Vielleicht kann man diesen schöner gestalten.

Gruß, Domi
 
prüfen, ob datum exisitiert und in der vergangenheit liegt:
Code:
if (is_numeric(strtotime($datum)) && strtotime($datum) < time())

prüfen, ob datum exisitiert und in der zukunft liegt:
Code:
if (is_numeric(strtotime($datum)) && strtotime($datum) > time())

prüfen, ob 2 daten exisitiert, in der zukunft liegen und enddatum chronologisch nach dem startdatum ist:
Code:
if (is_numeric(strtotime($startdatum)) && strtotime($startdatum) < time() && strtotime($startdatum)  < strtotime($enddatum) )
 
Zuletzt bearbeitet:
Ahh.. Jetzt habe ich auch noch einen Fehler bei mir gemacht, aber kurze Frage zu deinen Beispielen.. kann man die Echtheit von einem Datum wirklich mit "is_numeric()" prüfen?

Nun zu meinem Fehler selbst.. :(
Meine Überprüfung gibt noch Fehler aus. Sprich, ist das Datum falsch (z.B. 30.02.2012) sagt er das Datum falsch ist. Ist das richtig, aber Datum ist in der Vergangenheit gibt es die Info das das Datum in der Vergangenheit liegt. Ist das richtig, gibt er beim letzten Fehler aus dass das End- Datum nicht vor dem Anfang liegen kann.

Das war der Grund, warum ich das so verschachtelt hatte.. beim überfliegen von meinem Code habe ich erst gedacht "warum hast Du das nicht wie in dem Beispiel gebaut!?" und dann ist mir eingefallen das ich immer ein else mit der Fehler Info erstellt habe.
 
Domi83 schrieb:
Ahh.. Jetzt habe ich auch noch einen Fehler bei mir gemacht, aber kurze Frage zu deinen Beispielen.. kann man die Echtheit von einem Datum wirklich mit "is_numeric()" prüfen?

Ausgehend davon, dass das Datum in US-Syntax (mm-dd-yyyy) eingegeben wurde und PHP >= 5.1 läuft... ja, hier würde is_numeric funktionieren. strtotime guckt nach, ob das eingegebene Ding ein Datum ist: Wenn ja -> erzeuge timestamp (und die ist nun einmal numeric). Wenn nein -> return false (is definitiv nicht numeric *G*)

Im Endeffekt wirst du aber wollen, dass deine Kunden dd.mm.yy oder dd.mm.yyyy eingeben, nicht die amerikanische Reihenfolge. Da wirds mit strtotime schon wieder dünn.
 
strtotime funktioniert auch mit deutschen Daten (siehe Doku).

PHP hat unabhängig vom Eingabeformat (natürlich) aber mal wieder eingebaute Fallen. Z.B. wird aus dem 31. Februar (Hinweis: dieses Datum ist Unsinn...) automatisch der 3. März.

In der Doku wird außerdem empfohlen, strtotime NICHT zum Rechnen zu verwenden.

Dazu gibt es das neuere DateTime-Modul, was alles nötige bereitstellen müsste und auch verständlicher ist. Natürlich auch hier wieder mit Fallen powered by PHP.

Bei deinen if-Problemen verstehe ich das eigentliche Problem nicht.

Allgemeiner Tipp: Um nicht mehrere ifs verschachteln zu müssen, kannst du mit Guards arbeiten. Dafür negierst du die jeweilige Bedindung und bricht jeweils ab (z.B. mir return oder einer Exception).

PHP:
function doSomething($stuff) {
    if (!condition($stuff))
        throw new Exception('stuff is not valid because condition is not met');  // oder return

    if ($stuff > 9000)
        throw new Exception('not valid because stuff is over 9000');  // oder return

    echo "it's valid, let's do something";
    // ...
}

Damit kann man elegant und übersichtlich Schritt für Schritt viele Bedingungen abhandeln, jeweils mit eigener Fehlermeldung.
 
Zuletzt bearbeitet:
Okay, PHP bietet ja seit einer gewissen Version die Klasse DateTime(), mit der hatte ich schon einmal Abstände verglichen. Das wäre schon mal die Variante, mit der die Abstände (hoffe ich) richtig berechnet werden :)

Das mit dem "guards" sagt mir so nichts, aber anhand deines Beispieles überprüfst Du bei der if Bedingung, ob in der Methode / Funktion ein true oder false zurück gegeben wird, ist das richtig? Also, Beispiel...
PHP:
if(!methode()) {
 echo "hier stimmt etwas nicht!";
}
so verstehe ich es zumindest aus dem Beispiel heraus, und werde das einmal in Angriff nehmen :)

Daaron schrieb:
Im Endeffekt wirst du aber wollen, dass deine Kunden dd.mm.yy oder dd.mm.yyyy eingeben, nicht die amerikanische Reihenfolge.
Yes, dass ist mein Ziel.. Wobei ich auf den Wunsch von Chef im Moment drei select-Felder besitze, für Tag, Monat und Jahr. Aber das will ich wieder in ein input-Feld umstellen und so einen Java-Calender einbinden, den mir mein Kollege gezeigt hatte. Das ist eigentlich ein ganz nettes feature.

Vorausgesetzt, dass JS beim Client aktiviert ist.

Gruß, Domi
 
Domi83 schrieb:
aber anhand deines Beispieles überprüfst Du bei der if Bedingung, ob in der Methode / Funktion ein true oder false zurück gegeben wird, ist das richtig?
Du musst deine Bedingungen natürlich nicht in Funktionen auslagern. Jede beliebige Bedingung ist in Ordnung.
Es geht hier nur darum, dass du die Bedingungen nicht verschachteln musst. Ich habe das Beispiel angepasst.

Domi83 schrieb:
Java-Calender einbinden
JavaScript hat mit Java nichts zu tun.
 
character schrieb:
JavaScript hat mit Java nichts zu tun.
Ja, ich meinte einen JS-Calender.. Habe das zweite "Script" unter den Tisch fallen lassen :D

character schrieb:
Es geht hier nur darum, dass du die Bedingungen nicht verschachteln musst. Ich habe das Beispiel angepasst.
Okay, dass Beispiel finde ich schon mal sehr gut.. Ich werde mir das einmal anschauen. Hatte auch eben versucht bei php.net die Exception zu verstehen, oder den Unterschied zu einem return etc. heraus zu finden :D

Aber so habe ich erst einmal einen Ansatz mit dem ich arbeiten kann.. Denke ich :)
Gruß, Domi
 
So ein JS-basierter Date Picker erlöst dich nicht davon, dass du die Daten auf Sinnhaftigkeit prüfen musst. Kann ja immer mal jemand ohne JS kommen...

Aber wenn du so n Date Picker suchst: http://www.monkeyphysics.com/mootools/script/2/datepicker
Den nehm ich gern, weil ich fast ausschließlich mit Contao arbeite und Contao nun einmal auf Mootools setzt. Für JQuery gibts natürlich entsprechend nette Alternativen, im Endeffekt nehmen sich die Frameworks eh nix.
 
Daaron schrieb:
So ein JS-basierter Date Picker erlöst dich nicht davon, dass du die Daten auf Sinnhaftigkeit prüfen musst.
Öhm.. Ne, vielleicht habe ich das jetzt ein wenig durcheinander gebracht, weil ich JS erwähnt hatte. Es handelt sich um eine Buchungsmaske für eine Versicherung bei uns in der Firma :)

Am Anfang gibt man den Versicherungspreis ein, und bei "onchange" wird dann das JS Skript aktiv und errechnet schon einmal die Prämie aus der Datenbank. Die die Überprüfung, ob Daten vollständig sind etc., folgt via PHP :) Ich hatte zu Anfang mal an eine Kontrolle via JS gedacht, aber dann ist mir eingefallen das man JS auch deaktivieren könnte und somit die Kontrolle umgeht. Das soll ja nicht der Fall sein ;)

Oder reden wir gerade an einander vorbei?! :D
Gruß, Domi
 
Na ja, du hast am Ende ein Input-Feld (aktuell noch: type="text", in 1-2 Jahren oder so type="date"), in das normal dd.mm.yyyy eingetragen werden kann (und das vom PHP-Script auf Sinn geprüft wird). Gleichzeitig überlagerst du mit einem Date Picker (wie z.B. dem von monkeyphysics.com) das Feld mit einem coolen Datums-Selektor, der je nach Skin z.B. an die Kalenderanwendungen von Vista oder MacOS erinnert.
Ob du jetzt mit einer Eingabe weiter rechnest oder mit dem, was im Date Picker gewählt wurde, spielt ja dabei keine Rolle. Es ist für den User nur viel handlicher, wenn er einen vertrauen Kalender hat und (bei aktivem JS) zumindest schon einmal ausgeschlossen ist, dass er einen 30. Februar wählt.
 
Ahh.. Ich glaube was JS angeht, meintest Du so etwas wie im Screenshot, oder? Das habe ich bei uns nämlich gestern eingebaut, aber farblich noch nicht angepasst. Mein Kollege hatte mir das Teil von rainforestnet.com genannt, und meinte nur das es recht simple aufgebaut ist :)

Das ist nämlich auch ein Grund, warum ich wollte das JS überprüft wird. Ich habe einfach einen <noscript></noscript> um meine DIV Box gebaut, in der die Meldung kommt dass das System mit JS besser funktionieren würde.

Gruß, Domi
 

Anhänge

  • date-picker.jpg
    date-picker.jpg
    47,5 KB · Aufrufe: 154
Zurück
Oben