Compiwurstel: Nach Datum laden

Im März hatte mir Hopsel auf meine Anfrage in diesem Forum (http://forum.de.selfhtml.org/archiv/2007/3/t149364/) eine Möglichkeit genannt, wie ich Seiten nach Wochentagen laden kann. Das hat bisher auch prima funktioniert. Jetzt habe ich diesen Timer wieder eingesetzt und plötzlich wird von Frei bis So die falsche Seite geladen.
Zum Hintergrund:
Hopsels Lösung sah so aus:

if (date('w') < 5)         // Montag bis Donnerstag,
   $woche = date('W');     // also wird der Terminplan für die
                           // laufende Woche eingebunden
else
   $woche = date('W') + 1; // Freitag bis Sonntag wird der
                           // Terminplan für die folgende Woche eingebunden
include 'wp'.$woche.'.inc.php';

Die Seite soll also von Mo bis Do gemäß der Kalenderwoche geladen werden, von Frei bis So bereits die Seite der nächsten Woche. genau das passiert nun nicht mehr! Hat jemand eine Erklärung?

Gruß Compiwurtsel

  1. Hello,

    Hopsels Lösung sah so aus:

    if (date('w') < 5)         // Montag bis Donnerstag,
       $woche = date('W');     // also wird der Terminplan für die
                               // laufende Woche eingebunden
    else
       $woche = date('W') + 1; // Freitag bis Sonntag wird der
                               // Terminplan für die folgende Woche eingebunden
    include 'wp'.$woche.'.inc.php';

    Dir ist schon klar, dass diese Auflösung nicht ganz OK ist?
    date() benutzt immer den aktuellen timestamp, wenn keiner angegebn wird.
    Der sollte also der Ordnung halber als erstes geholt werden, und dann als Variable in beide date()-Aufrufe eingestzt werden, damit die Funktion auch mit demselben Timestamp ausgeführt wird.

    Ich nehme allerdings nicht an, dass das hier die Lösung des Rätsels ist.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Hallo,

    Jetzt habe ich diesen Timer wieder eingesetzt und plötzlich wird von Frei bis So die falsche Seite geladen.

    Was genau heißt "falsche Seite"? Die vorgie Woche? Die aktuelle Woche? Die übernächste Woche?

    Hopsels Lösung sah so aus:

    if (date('w') < 5)         // Montag bis Donnerstag,

    Das ist übrigens strenggenommen falsch, da date ('w') für Sonntag 0 (und nicht 7) liefert. Korrekt wäre (inklusive Toms korrekter Bemerkung eingearbeitet):

    $jetzt = time ();  
    $wochentag = date ('w', $jetzt);  
    $woche = date ('W', $jetzt);  
      
    if ($wochentag == 0 || $wochentag >= 5) // Sonntag oder Freitag/Samstag  
      $woche++;
    

    Nachdem Du allerdings Deiner Aussage nach nicht nur Sonntags ein Problem hattest, sondern auch Freitags und Samstags, wird Dir das Dein Problem vermutlich nicht lösen, daher solltest Du vielleicht mal etwas genauer erklären, was denn schiefläuft.

    Viele Grüße,
    Christian

    1. Hallo Christian,

      Was genau heißt "falsche Seite"? Die vorgie Woche? Die aktuelle Woche? Die übernächste Woche?

      Wie gesagt, es soll von Freitag bis Sonntag eigentlich die Seite der nächsten Kalenderwoche geladen werden, aber es wird die der aktuellen Kalenderwoche geladen. Also konkret: Wir haben zZ. die 42. KW. Von Freitag bis Sonntag sollte also die Seite wp42.inc.php geladen werden, tatsächlich aber wurd die Seite wp41.inc.php geladen. Komisch ist - wie gesagt - dass es bei den letzten Einsätzen des Skripts (ca. 6 Monaten) tadellos funktionierte!
      Gruß Compiwurstel

      1. Hallo,

        Was genau heißt "falsche Seite"? Die vorgie Woche? Die aktuelle Woche? Die übernächste Woche?

        Wie gesagt, es soll von Freitag bis Sonntag eigentlich die Seite der nächsten Kalenderwoche geladen werden, aber es wird die der aktuellen Kalenderwoche geladen. Also konkret: Wir haben zZ. die 42. KW. Von Freitag bis Sonntag sollte also die Seite wp42.inc.php geladen werden, tatsächlich aber wurd die Seite wp41.inc.php geladen. Komisch ist - wie gesagt - dass es bei den letzten Einsätzen des Skripts (ca. 6 Monaten) tadellos funktionierte!

        Jetzt verstehe ich gerade gar nichts mehr... Wenn wir gerade (wie Du korrekterweise sagtest) die 42. Kalenderwoche haben, dann müsste doch von nächsten Freitag bis nächsten Sonntag die Seite für die 43. Kalenderwoche geladen werden - und, wenn Dein Script so wie Du sagst fehlerhaft ist - stattdessen die 42. laden? Wie kommst Du jetzt plötzlich auf die 41.?

        Viele Grüße,
        Christian

        1. Hallo Christian,
          Du hast vollkommen Recht, ich redete vom vergangenen Freitag bis gestern!

          Gruß Compiwurstel

          1. Hallo,

            Also, ich kann Dein Problem nicht direkt nachvollziehen. Daher habe ich mal eine Testseite geschrieben, die den Code veranschaulicht:

            http://www.christian-seiler.de/temp/test-kw-1.php

            Du kannst oben einen Tag aus Oktober 2007 auswählen und zu dem wird dann die Kalenderwoche berechnet.

            Der Code macht dies DREI Mal:

            1) Er berechnet einfach nur die Kalenderwoche für das Datum selbst, ohne
                irgendwas anderes zu berücksichtigen.
             2) Er berechnet die anzuzeigende Kalenderwoche nach dem alten Code, den Du
                gepostet hattest (die Funktion kw_alt).
             3) Er berechnet die Kalenderwoche nach dem neuen Code, den ich Dir gepostet
                hatte (die Funktion kw_neu).

            Ganz am Ende der Seite zeigt sie ihren eigenen Sourcecode an, so dass Du ihn nachvollziehen kannst.

            Für heute: http://www.christian-seiler.de/temp/test-kw-1.php?day=15
            Für gestern: http://www.christian-seiler.de/temp/test-kw-1.php?day=14
            Für vorgestern: http://www.christian-seiler.de/temp/test-kw-1.php?day=13

            Wie Du siehst, funktioniert der alte UND der neue Code sowohl für heute als auch für Samstag problemlos. Lediglich für Sonntag schlägt der alte Code fehl und zeigt die vorige Woche an - den Grund dafür habe ich Dir jedoch bereits im vorigen Posting genannt.

            Insofern: Ich kann Dein Problem nur für Sonntag nachvollziehen, den Grund und die Lösung dafür hatte ich Dir bereits gepostet und für Freitag und Samstag funktioniert das ganze bei mir. Bist Du Dir sicher, dass der Fehler nicht noch irgendwo anders liegt?

            Viele Grüße,
            Christian

            1. Hallo Christian,
              erst mal ganz herzlichen Dank für die viele Mühe, die Du Dir machst!!!
              Habe aufgrund Deines letzten Postings mal mein Gedächtnis durchforstet und dabei festgestellt, dass ich nicht wirklich ausschließen kann, dass der Fehler nur Sonntags auftritt: da ich gerade Urlaub habe, habe ich die Funktion des Timers tatsächlich nur an den beiden letzten Sonntagen überprüft. Und da der letzte Einsatz des skripts - wie gesagt - ca. 6 Monate her ist (ich nutze es immer nur für die Urlaubszeit!), kann ich nicht mehr genau sagen, wann ich es da überprüft habe. Könnte also durchaus sein, dass ich es da an einem Freitag oder Samstag überprüft habe und mir der Fehler deshalb nicht ausgeschlossen ist.

              Nun stehe ich - was php angeht, noch ziemlich am Anfang. Deshalb leuchtet mir deine Lösung des ersten Postings zwar ein, weiß aber nicht, wie ich das dann korrekt umsetzen soll:

              Wenn ich das richtig verstehe, muss doch nach wie vor eine if-else-Struktur vorhanden sein, aus der heraus, je nachdem, welche der Bedingungen erfüllt ist, die richtige Seite geladen wird (also aktuell wp42.inc.php und ab kommenden Freitag dann wp43.inc.php).

              Viele Grüße Compiwurstel

              1. Hallo,

                Nun stehe ich - was php angeht, noch ziemlich am Anfang. Deshalb leuchtet mir deine Lösung des ersten Postings zwar ein, weiß aber nicht, wie ich das dann korrekt umsetzen soll:

                Wenn ich das richtig verstehe, muss doch nach wie vor eine if-else-Struktur vorhanden sein, aus der heraus, je nachdem, welche der Bedingungen erfüllt ist, die richtige Seite geladen wird (also aktuell wp42.inc.php und ab kommenden Freitag dann wp43.inc.php).

                Jain. Mein Code arbeitet etwas anders. Schauen wir uns mal den Code an, den Du vorher verwendet hast:

                if (date('w') < 5)         // Montag bis Donnerstag,  
                   $woche = date('W');     // also wird der Terminplan für die  
                                           // laufende Woche eingebunden  
                else  
                   $woche = date('W') + 1; // Freitag bis Sonntag wird der  
                                           // Terminplan für die folgende Woche eingebunden  
                include 'wp'.$woche.'.inc.php';
                

                Was macht der? Der überprüft in einer Bedingung, welcher Wochentag es ist (und macht dabei halt den Sonntag falsch) und dann führt er entweder $woche = date ('W') oder $woche = date ('W') + 1 aus.

                Ich mache das etwas anders: Ich hole mir immer die aktuelle Woche und speichere sie in $woche - und dann addiere ich halt 1, wenn es Freitag bis Sonntag ist. Es ist wohl Geschmackssache, welchen Ansatz man nimmt.

                Im folgenden mal beide Varianten funktionierend implementiert (inklusive dem include selbst):

                Meine Variante mit "erst Woche holen, dann evtl. 1 addieren":

                // 1. Aktuelles Datum holen, damit immer das gleiche Datum  
                // der Berechnung zu Grunde liegt  
                $jetzt = time ();  
                // 2. Den aktuellen Wochentag bestimmen  
                $wochentag = idate ('w', $jetzt);  
                // 3. Die aktuelle Kalenderwoche bestimmen  
                $woche = idate ('W', $jetzt);  
                  
                // Wenn der Wochentag ein Sonntag (== 0) oder ein Freitag/Samtsag (>= 5) ist  
                if ($wochentag == 0 || $wochentag >= 5)  
                  ++$woche; // Addiere 1 auf $woche  
                  
                // Binde die jeweilige Seite der Kalenderwoche ein  
                include 'wp'.$woche.'.inc.php';
                

                Die andere Variante mit "if/else-Verzweigung":

                // 1. Aktuelles Datum holen, damit immer das gleiche Datum  
                // der Berechnung zu Grunde liegt  
                $jetzt = time ();  
                // 2. Den aktuellen Wochentag bestimmen  
                $wochentag = idate ('w', $jetzt);  
                  
                // Wenn der Wochentag zwischen Montag (1) und Donnerstag (4) liegt  
                if ($wochentag >= 1 && $wochentag <= 4)  
                  $woche = idate ('W', $jetzt); // Aktuelle Kalenderwoche nutzen  
                else  
                  $woche = idate ('W', $jetzt) + 1; // Aktuelle Kalenderwoche nutzen  
                  
                // Binde die jeweilige Seite der Kalenderwoche ein  
                include 'wp'.$woche.'.inc.php';
                

                Such Dir eins von beidem aus. :-)

                Viele Grüße,
                Christian

                1. Hallo Christian,
                  nochmal: vielen, vielen Dank für Deine Mühe, finde ich echt super! Hab ich jetzt auch kapiert, allerdings kriege ich jetzt ne Fehlermeldung:
                  Fatal error: Call to undefined function: idate()

                  Viele Grüße
                  Compiwurstel

                  1. Hallo,

                    nochmal: vielen, vielen Dank für Deine Mühe, finde ich echt super! Hab ich jetzt auch kapiert, allerdings kriege ich jetzt ne Fehlermeldung:
                    Fatal error: Call to undefined function: idate()

                    Oh, dann hast Du noch PHP4 und nicht PHP5, dann mach überall, wo's auftritt, das »i« weg, dann sollte es klappen.

                    Viele Grüße,
                    Christian

                    1. Alles klar, es funktioniert! Tausend Dank noch mal!!!

                      Viele Grüße
                      Compiwurstel