PHP Fälligkeitsdatumüberprüfung

  • PHP

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Link.

    PHP Fälligkeitsdatumüberprüfung

    Guten Morgen,

    sitze seit längerem an einem Skript, welches täglich aufgerufen werden soll und entsprechend beurteilen soll, ob das Datum abgelaufen oder noch gut ist.
    Leider erhalte ich immer falsche Ergebnisse und möchte euch daher gerne um Hilfe bitten, eventuell wisst ihr, was ich hier falsch mache oder könnt mir eine bessere Lösung vorschlagen.

    Vorab, was gemacht werden soll:
    Heutiges Datum wird überprüft mit dem Fälligkeitsdatum (hier im Code erstmal nur ein Testdatum). Jetzt werden alle Fälligkeitsstufen ausgelesen und die Intervalle und dann beurteilt, welcher Stufe das Datum entspricht.

    Hier aber das Problem, es stimmt nicht überein, ich erhalte immer falsche Ergebnisse. Wieso das so ist und wie genau, weiß ich nicht. Habe inzwischen mehrere Versionen geprüft, hier mal eine.

    Vorher aber noch die Fälligkeitsstufen, welche aus der DB dynamisch ausgelesen werden. (siehe Anhang).

    Und hier ein Code, welcher aber falsch auswertet:

    PHP-Quellcode

    1. $testdate = ""; //hier das Datum im Y-m-d Format
    2. $getStates = $db->query("SELECT stateName, stateBegin FROM dueDates ORDER BY stateBegin ASC")->fetchAll();
    3. foreach($getStates as $state){
    4. if($state['stateBegin'] >= 0){
    5. if($testdate <= date('Y-m-d', strtotime($today . " +" . $state['stateBegin'] . " days"))){
    6. $status = $state['stateName'];
    7. }
    8. }else{
    9. if($testdate >= date('Y-m-d', strtotime($today . " " . $state['stateBegin'] . " days"))){
    10. $status = $state['stateName'];
    11. }
    12. }
    13. }
    14. echo $status;


    Es soll ausgewertet werden, in welcher Fälligkeitsstufe sich das Datum befindet im Bezug auf das heutige Datum.

    Ich danke im Voraus!
    Bilder
    • Fälligkeit.png

      5,79 kB, 315×181, 106 mal angesehen
    Wie sieht denn $today aus?
    Arbeite doch mit DateTime::modify, da kannst du dir dein $state['stateBegin'] >= 0 sparen.
    php.net/manual/de/datetime.modify.php

    PHP-Quellcode

    1. $d = new DateTime();
    2. echo $d->format('c')."\n";
    3. $d->modify("1 day");
    4. echo $d->format('c');


    PS: Warum arbeitest/vergleichst du Strings, obwohl es sich um DateTime-Werte handelt? Auch wenn es funktioniert, schön ist es nicht.

    slice schrieb:

    Wie sieht denn $today aus?

    $today ist das heutige Datum. Um das Skript zu testen, habe ich das Datum geändert, um die verschiedenen Fälligkeitsstufen zu simulieren.

    slice schrieb:

    Arbeite doch mit DateTime::modify, da kannst du dir dein $state['stateBegin'] >= 0 sparen.

    Benutze ja nur >= 0, um die "Formel" zum vergleichen anzupassen.
    Sehe in DateTime keinen Vorteil, was mit strtotime() für meine Zwecke nicht gehen würde.

    slice schrieb:

    PS: Warum arbeitest/vergleichst du Strings, obwohl es sich um DateTime-Werte handelt? Auch wenn es funktioniert, schön ist es nicht.

    Das Testdatum wird später aus der DB ausgelesen, somit ist es sowieso erstmal ein String. Zudem arbeite ich ja extra mit strtotime(), was auch funktioniert. Es soll erstmal funktionieren.
    Das in $today das heutige Datum sein soll, konnte ich mir fast denken, die Frage ist jedoch ob dem wirklich so ist? Alles andere ist deine Sache, ich empfinde es zwar als falsch aber hey, man rechnet ja auch heutzutage mit Strings und wundert sich dann, wenn alles knallt. Hast du das Error Reporting von PHP aktiviert? Ist dir klar das du $status mit jedem Loop deiner Schleife überschreibst und am ende nur den letzten Wert hast? Zum testen evtl. mal else implementieren und dir anschauen was du dir da für Vergleiche zusammen baust? Kennst du var_dump bzw. print_r? Und was genau meinst du mit "...welcher aber falsch auswertet"?

    slice schrieb:

    die Frage ist jedoch ob dem wirklich so ist?

    Ja, wird, wenn jetzt nicht gerade beim Testen manuell festgelegt wird, einfach durch $today = date('Y-m-d'); bestimmt.

    slice schrieb:

    man rechnet ja auch heutzutage mit Strings und wundert sich dann, wenn alles knallt.

    Das ist doch was ganz anderes. Hier liegt ein Datum in einem String-Format vor und ich nutze eine offizielle PHP-Funktion, welche einen String zu einem Timestamp unwandelt, das ist vollkommen legitim. Klar, mag es da auch andere Alternativen geben, aber ich sehe hier keinen Fehler zumal ich das erstmal zum Laufen bekommen möchte.

    slice schrieb:

    Hast du das Error Reporting von PHP aktiviert?

    Ja.

    slice schrieb:

    Ist dir klar das du $status mit jedem Loop deiner Schleife überschreibst und am ende nur den letzten Wert hast?

    Ist mir klar, ist ja auch beabsichtigt. Der soll überprüfen, ob der jeweilige Status zutrifft. Da das geordnet abgeklappert wird, sollte er am Ende nur die übernehmen, die wirklich zutreffen oder? Habe ich hier vielleicht einen Denkfehler?

    slice schrieb:

    Kennst du var_dump bzw. print_r?

    Ja, kenne ich - beides.

    slice schrieb:

    Und was genau meinst du mit "...welcher aber falsch auswertet"?

    Na ganz einfach, als $today nehmen wir einfach mal das Datum vor 1 Woche. Wird das Skript aufgerufen, das Fälligkeitsdatum wäre heute, müsste der Status eigentlich "wird fällig" sein, stattdessen zeigt er aber z.B. gesperrt an, also ein falscher Status wird ermittelt. Komme leider nicht dahinter, wie er wann welchen Status anzeigt.
    @GCAsk so hier

    Code:

    PHP-Quellcode

    1. <?php
    2. # Falls du ne ältere PHP Version (<PHP 5.4) installiert hast, musst du mit der array() Funktion und Schreibweise arbeiten, also $Produkte = array(...)
    3. # Siehe auch http://php.net/manual/de/language.types.array.php
    4. $Produkte = [
    5. [
    6. 'name' => 'Joghurt',
    7. 'ablaufdatum' => '2016-05-16'
    8. ], [
    9. 'name' => 'Fleisch',
    10. 'ablaufdatum' => '2016-05-06'
    11. ], [
    12. 'name' => 'Milch',
    13. 'ablaufdatum' => '2016-05-01'
    14. ]
    15. ];
    16. foreach($Produkte as $Produkt){
    17. echo "<p>" . $Produkt['name'] . " ";
    18. $diff = strtotime($Produkt['ablaufdatum']);
    19. if($diff - time() < 0){
    20. echo " ist abgelaufen!";
    21. }else{
    22. echo "läuft in " . floor(($diff - time()) / 60 / 60 / 24) . " Tagen ab!";
    23. }
    24. echo "</p>";
    25. }
    26. ?>


    Ausgabe:

    Quellcode

    1. Joghurt läuft in 11 Tagen ab!
    2. Fleisch läuft in 1 Tagen ab!
    3. Milch ist abgelaufen!



    Link :thumbup:
    Hello World
  • Benutzer online 1

    1 Besucher

  • 3 Benutzer haben hier geschrieben