Sönke Tesch: Jahresüberblick mit PHP/MySQL wie besser machen?

Beitrag lesen

Daher die Frage wie kann man es besser machen?

Wenn ich's Dir mal ganz unverblümt vor den Latz knallen darf: Dein Schreibstil ist saumäßig. Ganz besonders "schön" sind Stellen wie folgende:

}
  }
  }
  }
  $i++;
  }

Da weiß man doch gleich mit einem einzigen Blick, welche Klammer zu welchem if gehört..

Bitte gewöhne Dir an, Deine Programme zu strukturieren. Einfach alles stur untereinander in der ersten Spalte zu beginnen, fördert nicht gerade die Übersichtlichtkeit. Das mag Dir wurscht sein, aber wenn Du andere mit dem Code beglücken möchtest, tust Du gut daran, Ihnen den Einstieg zu erleichtern.

Dazu gehört auch, daß Variablennamen nicht erklärt werden müssen, sondern sich selbst erklären:

$i=1;
  //-- i=Monat
  $j=1;
  //-- j=Tag
  $k=$Date_Year;

Warum nennst Du die drei nicht einfach $tag, $monat, $jahr? Natürlich hast Du lange genug damit gearbeitet, um zu wissen, was i, j und k bedeuten mögen, aber jemand, der (wie hier im Forum) in Deinen Code stolpert, muß bei jeder Verwendung erstmal oben bei Deiner Erklärung nachschauen. Und Du in drei Monaten garantiert auch.

Zur eigentlichen Frage:

  • Die Datenbanktabelle enthält eine Menge Daten doppelt, genauer gesagt jene für den Zeitpunkt (viermal). Schmeiße Date_Year, Date_Month und Date_Day raus. Willst Du einen Tag haben, vergleiche mittels

$tag=sprintf(%04d%02d%02",$jahr,$monat,$tag);
  $sql="[..] zeit>=".$tag."000000 and zeit<=".$tag."235959";

Vergiss nicht, einen Index über die Zeitspalte anzulegen.

  • Du prüfst das Datum erst, nachdem Du die DB-Abfrage gemacht hast. Benutze checkdate() als erstes.

  • Liegt mehr als ein Termin pro Tag vor, gibst Du außer einer Detailadresse gar nichts aus. Füge an den SQL-Befehl entweder "limit  2", damit er sich nach dem zweiten Termin keine Mühe mehr machen muß.

  • Die SQL-Sortierung ist bei Dir im Moment nutzlos: Du fragst nur einen Termin pro Tag ab.

  • Ich habe es zwar nie ausprobiert, aber ich bin der Meinung, daß Anfragen an ein externes System (sprich: MySQL) eine Menge Zeit verbraten. Diese Anfragen sollten dementsprechend möglichst viel auf einmal "ranschaffen":

select ID,Status,City,No,dayofmonth(zeit) as tag,month(zeit) as monat,weekday(zeit) as wtag,count(*) as anzahl from Table where C_ID=$C_ID and year(select_date)=$jahr group by dayofyear(select_date)

Dann:

while ($termin=mysql_fetch_assoc(..))
    $termine[$termin["monat"]][$termin[$tag]]=$termin;

Dann:

for ($monat=1;$monat<=12;$monat++)
   {
    for ($tag=1;$tag<=31;$tag++)
     {
      if (checkdate($monat,$tag,$jahr))
        {
         if (isset($termine[$monat][$tag]))
           {
            if ($termine[$monat][$tag]["anzahl"]>1)
               echo "mehrere termine";
             else
               echo "ein termin, wochentag=".$termine[$monat][$tag]["wtag"];
           }
          else
           {
            echo "kein termin";
           };
        }
       else
        {
         echo "ungültiger tag";
        };
     };
   };

So in dem Dreh.

Gruß,
  soenk.e