x-plosiv: probleme mit dem jahreswechsel

hallo zusammen

ich habe in meiner kleinen agenda plötzlich einen bug. und ich finde einfach den fehler nicht....bis jetzt lief alles perfekt, bis im dezember.

eigentlich sollte er immer den aktuellen monat und die 2 darauf folgenden anzeigen.

jetzt gibt er aber die daten vom dezember nicht mehr an...nur jan und feb.

ich hoffe jemand kann mir helfen.

besten dank im voraus

hier mein code:

for($monat=0;$monat<3;$monat++)
{
$result = mysql_db_query("xxx","select * from prog where month(datum) = MOD(MONTH(NOW()), 12) + '$monat' ORDER by Datum");

while......

}

  1. Moin!

    [1] for($i=0;$i<3;$i++)  {
    [2]   $intMonat=$date("n")+$i;
    [3]   if ($intMonat > 12) {
    [4]     $intMonat=$intMonat-12;
    [5]   }
    [6]   $sql="SELECT * FROM prog WHERE month(datum) = $intMonat ORDER BY datum";

    [7]   $result = mysql_db_query($conn,sql) OR die("<hr>".mysqlerror($conn)."<hr>$sql<hr>");
    [8]  while ...
    [9] }

    Sollte es tun.

    Erläuterungen:
    [1] zählt von 0 bis 3...
    [2] die Funktion liefert den aktuellen Monat, es wird 0 ... 2 addiert.
    [3]-[5] Da kann schon mal 1 bis 14 rauskommen, also ziehen wir in [4] bei allen Monaten, die größer als 12 sind 12 ab :)
    [6] Schreibe den SQL- String immer in eine Variable. Du kannst Ihn so ausgeben lassen!
    [7] Abfrage und Fehlerbehandlung!
    [8] weiter

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Moin!

      Und mit dem Jahr sieht es so aus:

      [1] for($i=0;$i<3;$i++)  {
      [2]   $intMonat=$date("n")+$i; $IntYear=$date("n");
      [3]   if ($intMonat > 12) {
      [4]     $intMonat=$intMonat-12; $IntYear++;
      [5]   }
      [6]   $sql="SELECT * FROM prog WHERE month(datum) = $intMonat AND year(datum) = $intYear ORDER BY datum";

      [7]   $result = mysql_db_query($conn,sql) OR die("<hr>".mysqlerror($conn)."<hr>$sql<hr>");
      [8]  while ...
      [9] }

      Anmerkung:
      [6] Ich nehme an, du hast den '*' im SQL- String nur als Platzhalter für die Namem der Tabellenspalten stehen und verwendest Ihn im Programm nicht. Das ist "unmittelbarer" Fehler, kann aber für Unklarheit sorgen, z.B. Wenn Du die Tabellenstruktur änderst.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
      1. super...funktioniert.

        für alle die diese script übernehmen...achtung es hat noch fehler drin:

        alle date ohne $

        [2] date("Y")
        [6] IntYear statt intYear

        1. Moin!

          Pst! Das ist der SELF- Faktor in den Antworten :)

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    2. daaaaaaaaaaaaaaaaanke an euch.

      ich konnte es zwar noch nicht umsetzten, werde es aber heute abend versuche.

      besten dank...echt klasse von euch

  2. Moin!

    eigentlich sollte er immer den aktuellen monat und die 2 darauf folgenden anzeigen.

    Dann sage das der Datenbank: "Gib alle Einträge aus, die zwischen jetzt und in drei Monaten liegen."

    SELECT * FROM prog WHERE datum BETWEEN NOW() AND adddate(NOW(), INTERVAL 2 MONTH)

    Das liefert dir alles von HEUTE bis heute plus 2 Monate.

    Die Sache ist die: Wenn du dich nur auf den Monat beziehst, kriegst du logischerwiese alle DB-Einträge aus allen Jahren, die in den gewünschten Monaten liegen. Das ist toll für Geburtstage - und eher unpassend für einen Kalender.

    Selbst die Lösung für die Geburtstage ist nicht trivial. Du bist da schon in die Zerlegung des Query in drei Einzelabfragen geflüchtet. Das geht natürlich, ist nur nicht wirklich schön.

    Wenn du also wirklich die einzelnen Monate (unabhängig vom Jahr) abfragen willst:
    SELECT * FROM prog WHERE MONTH(datum) IN (MONTH(NOW()), MONTH(ADDDATE(NOW(), INTERVAL 1 MONTH)), MONTH(ADDDATE(NOW(), INTERVAL 1 MONTH))) ORDER BY datum;

    Abfragen, in denen das Jahr berücksichtigt wird, sind auch nicht so schwierig - es ist halt die erste Abfrage so anzupassen, dass das Start- und Enddatum auf die Monatsgrenzen fallen.

    Die Datumsfunktionen sind sehr interessant...
    http://www.mysql.de/doc/de/Date_and_time_functions.html

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)