xpfreund: Urlaubstage in MySql-Datenbank abfragen

Hallo,

Ich arbeite ja am Phprojekt. So, jetzt ist aber das Problem, dass wenn jemand einen Termin mit dem Titel "Urlaub" eintragen will und dieser Tag im Kalender andersfarbig dargestellt werden soll. Die Tabelle heißt "termine" und der Titel steht unter "events", außerdem gibt es noch ein Feld "an", welches mit einer Variable verglichen werden muss. Ich stelle mir das so vor: Ein User trägt an irgendeinem Tag einen Termin mit dem Titel "Urlaub" ein. Jetzt wird in der Datenbank mit einer Schleife jeder Tag des Monats durchgegangen und dabei abgefragt, ob für die Usernr. (steht im Feld "an") ein "event" Urlaub besteht. Wenn ja, gib den Tag grün aus, wenn nein dann lass ihn normal.
Eine vereinfachte Version meines Kalenders:

<?php
for ($i = 1; $i <= date ('t', mktime(0,0,0,04,27,2007)); $i++) {
echo $i;
echo " ";
if (date('w', mktime(0,0,0,04,$i,2007)) == 0 || date('w', mktime(0,0,0,04,$i,2007)) == 6) {
              echo "<span class="woche">Wochenende</span>";}
              else {echo "Woche";}
echo "<br>";
}
?>
Ich hoffe ihr könnt mir sagen, wie man diese Abfrage schreiben muss.
Danke schonmal im Vorraus.

gruß aus Hosena

  1. Hello,

    benutzt Du eine Datenbank, die Stored Procedures, Funktionen und Trigger kennt?

    Was soll denn im Kalender überhaupt angezeigt werden?

    Du weißt, dass Du auch Spalten ausgeben lassen kannst im Resultset, die in der Tabelle gar nicht enthalten sind? Diese kannst Du berechnen lassen.

    Wenn Du nun für jeden Tag einen Datensatz erzeugen lässt, dann füge doch einfach eine Spalte an, in der die Anzahl der Urlauber für diesen Tag gezählt werden. Das funktioniert mit einer Stored Procedure und zwei Uservariablen, die Du Dir bereitstellst. Eine für die Gruppe( den Tag), eine für die Anzahl der Urlauber an diesem Tag.

    Wenn dann später Dein Darstellungstool auf einen Eintrag "urlauber = 2" läuft, weißt Du, dass der Tag anders dargestellt werden soll.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hallo,

      Du weißt, dass Du auch Spalten ausgeben lassen kannst im Resultset, die in der Tabelle gar nicht enthalten sind? Diese kannst Du berechnen lassen.

      Wenn Du nun für jeden Tag einen Datensatz erzeugen lässt, dann füge doch einfach eine Spalte an, in der die Anzahl der Urlauber für diesen Tag gezählt werden. Das funktioniert mit einer Stored Procedure und zwei Uservariablen, die Du Dir bereitstellst. Eine für die Gruppe( den Tag), eine für die Anzahl der Urlauber an diesem Tag.

      Wenn dann später Dein Darstellungstool auf einen Eintrag "urlauber = 2" läuft, weißt Du, dass der Tag anders dargestellt werden soll.

      Dann hast du mich überhaupt nicht verstanden.
      Eine ganz normale MySql-Datenbank ohne Zusätze.
      Eine Gruppe von 4 Leuten.
      Jeder hat eine eigene eindeutige Erkennungsnummer in der Datenbank.
      Wenn einer der User einen Termin einträgt, steht in der Tabelle "termine" unter dem Feld "an" seine Nummer.
      Dann gibt es eine weitere Spalte "datum", die festlegt, wann der Termin ist.
      In der Spalte "event" steht der Titel.
      Wenn bei "event" Urlaub und bei an die eigene Nutzernummer steht, soll der unter "datum" festgelegte Tag im eigenen Kalender z. B. grün angezeigt werden.
      Dies ist immer in einem ganzen Monat abzufragen, also meiner Ansicht nach mit einer Schleife, die automatisch bis zum mit date(t) festgelegten letzten Tag des Monats hochzählt und alle Tage mit dem Termin "Urlaub" grün darstellt.
      Hoffe es ist ein bisschen klarer geworden.

      gruß aus Hosena

      1. Hello,

        Du weißt, dass Du auch Spalten ausgeben lassen kannst im Resultset, die in der Tabelle gar nicht enthalten sind? Diese kannst Du berechnen lassen.

        Wenn Du nun für jeden Tag einen Datensatz erzeugen lässt, dann füge doch einfach eine Spalte an, in der die Anzahl der Urlauber für diesen Tag gezählt werden. Das funktioniert mit einer Stored Procedure und zwei Uservariablen, die Du Dir bereitstellst. Eine für die Gruppe( den Tag), eine für die Anzahl der Urlauber an diesem Tag.

        Wenn dann später Dein Darstellungstool auf einen Eintrag "urlauber = 2" läuft, weißt Du, dass der Tag anders dargestellt werden soll.
        Dann hast du mich überhaupt nicht verstanden.

        Wahrscheinlich doch. Aber ich habe wohl zuviele Schritte auf einmal gemacht...

        Eine ganz normale MySql-Datenbank ohne Zusätze.
        Eine Gruppe von 4 Leuten.
        Jeder hat eine eigene eindeutige Erkennungsnummer in der Datenbank.
        Wenn einer der User einen Termin einträgt, steht in der Tabelle "termine" unter dem Feld "an" seine Nummer.
        Dann gibt es eine weitere Spalte "datum", die festlegt, wann der Termin ist.
        In der Spalte "event" steht der Titel.

        an            datum         event
          ------------- ------------- ------------------
          1204          2007-04-30    Urlaub
          815           2007-05-02    Urlaub
          1             2007-05-02    Urlaub

        Nur mal so als Beipiel, wie Du sowas besser darstellen könntest für uns, als nur textuell.

        Wenn bei "event" Urlaub und bei an die eigene Nutzernummer steht, soll der unter "datum" festgelegte Tag im eigenen Kalender z. B. grün angezeigt werden.

        Dies ist immer in einem ganzen Monat abzufragen, also meiner Ansicht nach mit einer Schleife, die automatisch bis zum mit date(t) festgelegten letzten Tag des Monats hochzählt und alle Tage mit dem Termin "Urlaub" grün darstellt.

        Hoffe es ist ein bisschen klarer geworden.

        Also sollte es keinen Übersichtskalender für alle geben, in dem der Tag rot markiert wird, wenn z.B. schon zwei Leute aus der Gruppe Urlaub haben.

        Da Du ein DBMS benutzt, benötigst Du für die Abfrage keine Schleife in der API-Funktion (also in PHP). Die "Schleife" ist nämlich in der Datenbank schon eingetragen.

        Du beschaffst Dir ein Array mit den relevanten Daten.
        In einer extra-Spalte könntest Du z.B. direkt den Farbwert für die Anzeige vorbereiten lassen

        select an, datum, event, if(event='Urlaub','#00FF00','#FFFFFF') as farbe
          from kalender  -- habe vergessen, wie die Tabelle heißt
          where (an = $an) and (datum between '2007-04-01' and '2007-04-30');

        Das gesamte Resultset übernummst Du in ein Array. Das ist bei 28-31 Tagen ja nichts Schlimmes

        Dieses Array übergibst Du dann an deine Kalender-Darstellungsfunktion, die den HTML-String für die Ausgabe fertig macht. In diesen String kannst Du fas Feld farbe direkt übernehmen und musst nicht in PHP noch rumhampeln.

        Ich hoffe, dass DU _mich_ jetzt verstanden hast... ;-)

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Hallo,

          In der Spalte "event" steht der Titel.

          an            datum         event
            ------------- ------------- ------------------
            1204          2007-04-30    Urlaub
            815           2007-05-02    Urlaub
            1             2007-05-02    Urlaub

          Da Du ein DBMS benutzt, benötigst Du für die Abfrage keine Schleife in der API-Funktion (also in PHP). Die "Schleife" ist nämlich in der Datenbank schon eingetragen.

          Du beschaffst Dir ein Array mit den relevanten Daten.
          In einer extra-Spalte könntest Du z.B. direkt den Farbwert für die Anzeige vorbereiten lassen

          select an, datum, event, if(event='Urlaub','#00FF00','#FFFFFF') as farbe
            from kalender  -- habe vergessen, wie die Tabelle heißt
            where (an = $an) and (datum between '2007-04-01' and '2007-04-30');

          Das gesamte Resultset übernummst Du in ein Array. Das ist bei 28-31 Tagen ja nichts Schlimmes

          Dieses Array übergibst Du dann an deine Kalender-Darstellungsfunktion, die den HTML-String für die Ausgabe fertig macht. In diesen String kannst Du fas Feld farbe direkt übernehmen und musst nicht in PHP noch rumhampeln.

          Das ist ja schon ein guter Ansatz, aber die Farbe wird in einer Wenn-Dann-Anweisung festgelegt, d. h. if ($dm=Urlaub and $an=1), dann {
            $da = "<div style='font-weight:900; color:".$holiday_color.";'>".$d."&nbsp;</div>";} .
          $dm = Tag und Monat der in der Spalte datum steht
          $d ist übrigens die Zahl des Tages, also z. B. 29.
          Wenn ich das nicht so mache, klappt die ganze Abfrage nicht.
          Der Kalender wird durch eine Schleife erstellt.
          Dabei wird die Schleife mit $d bis zum Ende des Monats je einmal durchlaufen.
          In der Schleife wird zuerst abgefragt, ob es ein Wochenende ist.
          Wenn ja wird eine Farbe festgelegt, wenn nicht kommt meine Urlaubsabfrage, wenn diese dann aber auch nicht zutrifft, wird die Farbe des normalen Tages gezeigt.

          gruß aus Hosena

          1. Hello,

            Hallo,

            In der Spalte "event" steht der Titel.

            an            datum         event
              ------------- ------------- ------------------
              1204          2007-04-30    Urlaub
              815           2007-05-02    Urlaub
              1             2007-05-02    Urlaub

            Da Du ein DBMS benutzt, benötigst Du für die Abfrage keine Schleife in der API-Funktion (also in PHP). Die "Schleife" ist nämlich in der Datenbank schon eingetragen.

            Du beschaffst Dir ein Array mit den relevanten Daten.
            In einer extra-Spalte könntest Du z.B. direkt den Farbwert für die Anzeige vorbereiten lassen

            select an, datum, event, if(event='Urlaub','#00FF00','#FFFFFF') as farbe
              from kalender  -- habe vergessen, wie die Tabelle heißt
              where (an = $an) and (datum between '2007-04-01' and '2007-04-30');

            Das gesamte Resultset übernummst Du in ein Array. Das ist bei 28-31 Tagen ja nichts Schlimmes

            Dieses Array übergibst Du dann an deine Kalender-Darstellungsfunktion, die den HTML-String für die Ausgabe fertig macht. In diesen String kannst Du fas Feld farbe direkt übernehmen und musst nicht in PHP noch rumhampeln.

            Das ist ja schon ein guter Ansatz, aber die Farbe wird in einer Wenn-Dann-Anweisung festgelegt, d. h.

            Nö, das ein Lösungsweg.

            while ($_rec = mysql_fetch_assoc($res))
              {
                $_kalender[] = $_rec;
              }

            if ($dm=Urlaub and $an=1)

            Das kannst Du Dir schenken, weil in dem Resultset nur Ergebnisse sind für den Mitarbeiter.

            $da = "<div style="font-weight:900; color:".$_kalender[$d-1]['farbe'].";">$d&nbsp;</div>";} .

            Der Kalender wird durch eine Schleife erstellt.

            Dagegen ist ja auch nichts einzuwenden

            Dabei wird die Schleife mit $d bis zum Ende des Monats je einmal durchlaufen.
            In der Schleife wird zuerst abgefragt, ob es ein Wochenende ist.
            Wenn ja wird eine Farbe festgelegt, wenn nicht kommt meine Urlaubsabfrage, wenn diese dann aber auch nicht zutrifft, wird die Farbe des normalen Tages gezeigt.

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

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hallo,

              Habs jetzt doch anders gelöst.
              <code lang=php>
              $result7 = db_query("select event
                                       from ".DB_PREFIX."termine
                                     where datum like '$datum2' and an=$user_ID") or db_die();
                $row7 = db_fetch_row($result7);
              </code>
              Das zu Beginn der Schleife.
              <code lang=php>
              elseif ($row7[0] == "Urlaub")
               { $da = "<div style='font-weight:900; color:".$holidays_color.";'>".$d."&nbsp;</div>";}
              </code>
              und das als Abfrage.

              Trotzdem Danke für eure Hilfe.

              gruß aus Hosena

          2. Hallo Hugo,

            ich bilde mir ein, über ganz ordentliche Datenbank- und PHP-Kenntnisse zu verfügen. Ich versuche durchaus auch nachzuvollziehen, was zwischen den Zeilen einer Fragestellung steht und klammere mich nicht an den wortwörtlichen Text der Frage.

            Ich habe leider kein Wort von Deinem Problem, das mir eher ein PHP als ein Datenbankproblem zu sein scheint, verstanden.

            Nochmals in Kürze der Vorschlag von Tom:

            Mit einer einzigen einfachen SELECT-Anweisung erhältst Du eine Ergebnismenge, die bereits alle Informationen enthält, die Du für Deinen Kalender benötigst.

            Diese Abfrage führst Du _einmal_, ein einziges Mal aus - und zwar vor der Schleife, die nachher Deinen Kalender erzeugt. Du holst Dir mittels PHP die Ergebnismenge ab; Du schreibst diese in ein PHP-Array. Alles noch vor Deiner Schleife.

            Danach verwendest Du in Deiner Schleife die Daten aus diesem Array.

            Es ist - egal in welcher Programmiersprachen - fast immer eine ganz schlechte Idee, eine Datenbank in einer Schleife, vielleicht sogar noch in verschachtelten Schleifen zu befragen, wenn man die Informationen auf einen Schlag bekommen kann.

            Merksatz: Datenbankzugriffe sind teuer, sehr teuer.

            Freundliche Grüße

            Vinzenz

        2. Hallo,

          Was ist bitte jetzt noch falsch?
          <code>
          $now_date = date("Y-m-d", mktime(date("H")+$timezone,date("i"),date("s"),date("m"),date("d"),date("Y")));
          for ($d=1; $d <= date("t", mktime(0,0,0,($month+1),0,$year)); $d++) {
            // fetch events
            $datum2 = date("Y-m-d",mktime(0,0,0,$month,$d,$year));
            $result3 = db_query("select ID
                                   from ".DB_PREFIX."termine
                                 where datum like '$datum2' and an=$user_ID") or db_die();
            $row3 = db_fetch_row($result3);
            // today = red
            if ($now_date == $datum2) {$da = "<div style='color:red; background-color:$terminfarbe; font-weight:bold;'>".$d."&nbsp;</div>";}
            // days with events = black
            elseif ($row3[0] > 0 and !$view) {$da = "<div style='color:black; font-weight:bold;'>".$d."&nbsp;</div>";}
            // weekend
            elseif (date('w', mktime(0,0,0,$month,$d,$year)) == 0 || date('w', mktime(0,0,0,$month,$d,$year)) == 6) {
            $da = "<div style='font-weight:900; color:".$weekend_color.";'>".$d."&nbsp;</div>";}
            // holidays
            else {select an, datum, event, if(event='Urlaub','$holidays_color','blue') as farbe
          </code>
          Unexpected T_String ab else
          <code>
          from termine
            where (an = $an) and (datum = '$year-$month-$d');
            if ($farbe == $holidays_color)  {
            $da = "<div style='font-weight:900; color:".$holidays_color.";'>".$d."&nbsp;</div>";}
            // normal day = blue
            else { $da = $d."&nbsp;"; }

          // day link
            echo "<td id=ri><a href="javascript:dayweek(1, $year, $month, $d, '$sid')">$da</a></td>\n";
            if (date("w", mktime(0,0,0,$month,$d,$year)) == 0 and date("t", mktime(0,0,0,($month+1),0,$year)) > $d )  {
              echo "</tr><tr>\n";
              // set values to show week number
              $da = $d + 1;
              $week_nr = get_week_nr($da);
              echo "<td>&nbsp;</td><td id=ri bgcolor=$bgcolor3><i><a href="javascript:dayweek(2, $year, $month, $da, '$sid')">$week_nr</a></i>&nbsp;&nbsp;</td>\n";

          }
          }
          </code>
          "from termine" ist in einer neuen Zeile, oder fehlt da nur irgendwo ein Semikolon?
          Sagt jetzt nicht, der Datenbankzugriff in der Schleife, außer ihr wisst, wie man das besser machen kann.

          gruß aus Hosena

          1. Hallo Hugo,

            Was ist bitte jetzt noch falsch?

            viel.

            <code>

            Wie Du Syntaxhervorhebeung bekommst, steht in der Hilfe:

            [ code lang=sprache ]
            ohne die Leerzeichen nach der einleitenden
            und vor der schließenden eckigen Klammer)
            Abschluss (wiederum ohne Leerzeichen) mit
            [ /code ]

            $now_date = date("Y-m-d", mktime(date("H")+$timezone,date("i"),date("s"),date("m"),date("d"),date("Y")));

            Hier beginnt eine Schleife

            for ($d=1; $d <= date("t", mktime(0,0,0,($month+1),0,$year)); $d++) {
              // fetch events

            # Den Ausdruck
                 # mktime(0, 0, 0, $month, $d, $year)
                 # benutzt Du im weiteren Code insgesamt dreimal

            Es ist daher sinnvoll diesen Wert einer Variablen zuzuweisen
                   und im folgenden auf diese Variable zuzugreifen.

              
                # Trenne die Argumente einer Funktion mit Leerzeichen nach dem Komma  
                $aktueller_tag = mktime(0, 0, 0, $month, $d, $year);  
                $datum2        = date("Y-m-d", $aktueller_tag);  
              
                # ist viel besser lesbar als  
              
            
            >   $datum2 = date("Y-m-d",mktime(0,0,0,$month,$d,$year));  
            
            

            # Hier setzt Du in einer Schleife ein SQL-Statement ab.
                 # Ein Statement für jeden Tag

            # Viel besser ist es, ein Statement _vor_ der Schleife für den
                 # ganzen Zeitraum abzusetzen

            # Noch besser ist es, das Statement, dass Du per PHP zusammenbaust
                 # zuerst einer Variablen zuzuweisen, die Du zu Debugzwecken auch
                 # ausgeben oder mitprotokollieren kannst.

            $result3 = db_query("select ID
                                     from ".DB_PREFIX."termine
                                   where datum like '$datum2' and an=$user_ID") or db_die();

            # Ein Skript sterben zu lassen, ist meist keine sinnvolle Fehlerbehandlung
                 # [...] WHERE datum LIKE
                 # deutet auf einen falschen Datentyp für das Datum hin.
                 # Du solltest außerhalb der Schleife mit BETWEEN arbeiten.

            $row3 = db_fetch_row($result3);

            # durchnumerierte Variablen sind miserable Variablen
                 # siehe auch </archiv/2006/5/t130464/#m843335>

            // today = red
              if ($now_date == $datum2) {

            # Formatiere irgendetwas als irgendwas
                     # ich vermisse Kommentare.
                     # Du wirst in ein paar Wochen nicht mehr wissen, was Du warum
                     # genau so programmiert hast.

            $da = "<div style='color:red; background-color:$terminfarbe; font-weight:bold;'>".$d."&nbsp;</div>";

            # wäre der Einsatz von CSS-Klassen nicht sinnvoller?

            }
              elseif ($row3[0] > 0 and !$view) {
                  // days with events = black
                  $da = "<div style='color:black; font-weight:bold;'>".$d."&nbsp;</div>";}

            // weekend

            hier könnten wir wieder die oben eingeführte Variable $aktueller Tag nutzen:

              
                 elseif (date('w', $aktueller_tag) == 0 || date('w', $aktueller_tag == 6) {  
              
            # statt  
              
            
            >   elseif (date('w', mktime(0,0,0,$month,$d,$year)) == 0 || date('w', mktime(0,0,0,$month,$d,$year)) == 6) {  
            
            

            $da = "<div style='font-weight:900; color:".$weekend_color.";'>".$d."&nbsp;</div>";}
              // holidays
              else {

            # Was bitte kommt jetzt?

            select an, datum, event, if(event='Urlaub','$holidays_color','blue') as farbe

            [/code]

            Unexpected T_String ab else

            Hm ja, inzwischen solltest Du es sehen :-)

            from termine
              where (an = $an) and (datum = '$year-$month-$d');

              
            Was soll mit diesem SQL-Statement, wenn Du es endlich in eine PHP-Zeichenkette  
            umgeformt hast, passieren. Noch eine Abfrage innerhalb der Schleife?  
              
            
            > "from termine" ist in einer neuen Zeile, oder fehlt da nur irgendwo ein Semikolon?  
            > Sagt jetzt nicht, der Datenbankzugriff in der Schleife, außer ihr wisst, wie man das besser machen kann.  
              
            Ja selbstverständlich hast Du völlig unnötig Datenbankzugriffe innerhalb einer  
            Schleife. Genau davon haben wir Dir abgeraten.  
              
            Zu Deiner Codestruktur  
              
             - Bitte schreibe/male Dir vorher auf altmodischem Papier die Struktur Deines Programmabschnittes auf.  
             - Nutze das Konzept der Funktionen.  
             - Gehe großzügig mit dem Einsatz von Kommentaren um  
              
              
            Freundliche Grüße  
              
            Vinzenz
            
            1. Hallo,

              $now_date = date("Y-m-d", mktime(date("H")+$timezone,date("i"),date("s"),date("m"),date("d"),date("Y")));

              Hier beginnt eine Schleife

              Ist mir klar

              for ($d=1; $d <= date("t", mktime(0,0,0,($month+1),0,$year)); $d++) {
                // fetch events

              # Den Ausdruck
                   # mktime(0, 0, 0, $month, $d, $year)
                   # benutzt Du im weiteren Code insgesamt dreimal

              Es ist daher sinnvoll diesen Wert einer Variablen zuzuweisen
                     und im folgenden auf diese Variable zuzugreifen.

              # Trenne die Argumente einer Funktion mit Leerzeichen nach dem Komma
                  $aktueller_tag = mktime(0, 0, 0, $month, $d, $year);
                  $datum2        = date("Y-m-d", $aktueller_tag);

              # ist viel besser lesbar als

              $datum2 = date("Y-m-d",mktime(0,0,0,$month,$d,$year));

              Ok, kann man machen.  
              
              >      # Hier setzt Du in einer Schleife ein SQL-Statement ab.  
              >      # Ein Statement für jeden Tag  
              >   
              >      # Viel besser ist es, ein Statement \_vor\_ der Schleife für den  
              >      # ganzen Zeitraum abzusetzen  
              >   
              >      # Noch besser ist es, das Statement, dass Du per PHP zusammenbaust  
              >      # zuerst einer Variablen zuzuweisen, die Du zu Debugzwecken auch  
              >      # ausgeben oder mitprotokollieren kannst.  
              
              Wie jetzt?  
              
              > >   $result3 = db\_query("select ID  
              > >                          from ".DB\_PREFIX."termine  
              > >                        where datum like '$datum2' and an=$user\_ID") or db\_die();  
              >      # Ein Skript sterben zu lassen, ist meist keine sinnvolle Fehlerbehandlung  
              >      # ` [...] WHERE datum LIKE `{:.language-sql}  
              >      # deutet auf einen falschen Datentyp für das Datum hin.  
              >      # Du solltest außerhalb der Schleife mit BETWEEN arbeiten.  
              
              Dafür kann ich nichts, so war es original. Between geht nicht, da man ja jeden Tag abfragen muss, auch in anderen Monaten, daher wurde die Schleife hier höchstwahrscheinlich so eingesetzt.  
              
              > >   $row3 = db\_fetch\_row($result3);  
              >   
              >      # durchnumerierte Variablen sind miserable Variablen  
              
              wie gesagt: original  
              
              > >   // today = red  
              > >   if ($now\_date == $datum2) {  
              >          # Formatiere irgendetwas als irgendwas  
              >          # ich vermisse Kommentare.  
              >          # Du wirst in ein paar Wochen nicht mehr wissen, was Du warum  
              >          # genau so programmiert hast.  
              >   
              > >       $da = "<div style='color:red; background-color:$terminfarbe; font-weight:bold;'>".$d."&nbsp;</div>";  
              >   
              >          # wäre der Einsatz von CSS-Klassen nicht sinnvoller?  
              
              das wird nicht erkannt. Im End-Html steht zwar <div class="x"> aber die Css die dort läuft, führt das nicht aus.  
              
              > >   }  
              > >   elseif ($row3[0] > 0 and !$view) {  
              > >       // days with events = black  
              > >       $da = "<div style='color:black; font-weight:bold;'>".$d."&nbsp;</div>";}  
              >   
              >   
              > >   // weekend  
              > # hier könnten wir wieder die oben eingeführte Variable $aktueller Tag nutzen:  
              >   
              > ~~~php
                
              
              >      elseif (date('w', $aktueller_tag) == 0 || date('w', $aktueller_tag == 6) {  
              >   
              > # statt  
              >   
              > >   elseif (date('w', mktime(0,0,0,$month,$d,$year)) == 0 || date('w', mktime(0,0,0,$month,$d,$year)) == 6) {  
              > 
              
              

              $da = "<div style='font-weight:900; color:".$weekend_color.";'>".$d."&nbsp;</div>";}
                // holidays
                else {

              # Was bitte kommt jetzt?

              Abfrage der Datenbank, ob für den User ein event 'Urlaub' gespeichert ist und Festlegung der Darstellungsfarbe in der Variable 'farbe'

              select an, datum, event, if(event='Urlaub','$holidays_color','blue') as farbe
              [/code ]

              Unexpected T_String ab else

              Hm ja, inzwischen solltest Du es sehen :-)

              nein, eben nicht

              from termine
                where (an = $an) and (datum = '$year-$month-$d');

              
              >   
              > Was soll mit diesem SQL-Statement, wenn Du es endlich in eine PHP-Zeichenkette  
              > umgeformt hast, passieren. Noch eine Abfrage innerhalb der Schleife?  
              
              Wie schon da stand: Wenn $farbe = $holidays\_color, dann entsprechend formatieren.  
              
              > > "from termine" ist in einer neuen Zeile, oder fehlt da nur irgendwo ein Semikolon?  
              > > Sagt jetzt nicht, der Datenbankzugriff in der Schleife, außer ihr wisst, wie man das besser machen kann.  
              > Ja selbstverständlich hast Du völlig unnötig Datenbankzugriffe innerhalb einer  
              > Schleife. Genau davon haben wir Dir abgeraten.  
              
              Da das auf einem lokalen Server läuft, ist das doch eh egal.  
                
              
              >  - Nutze das Konzept der Funktionen.  
              >  - Gehe großzügig mit dem Einsatz von Kommentaren um  
              
              Das wären zumindest Möglichkeiten für die Zukunft.  
                
              gruß aus [Hosena](http://www.hosena.de/)
              
              1. Hallo

                # Hier setzt Du in einer Schleife ein SQL-Statement ab.
                     # Ein Statement für jeden Tag

                # Viel besser ist es, ein Statement _vor_ der Schleife für den
                     # ganzen Zeitraum abzusetzen

                # Noch besser ist es, das Statement, dass Du per PHP zusammenbaust
                     # zuerst einer Variablen zuzuweisen, die Du zu Debugzwecken auch
                     # ausgeben oder mitprotokollieren kannst.
                Wie jetzt?

                $result3 = db_query("select ID
                                         from ".DB_PREFIX."termine
                                       where datum like '$datum2' and an=$user_ID") or db_die();
                     # Ein Skript sterben zu lassen, ist meist keine sinnvolle Fehlerbehandlung
                     # [...] WHERE datum LIKE
                     # deutet auf einen falschen Datentyp für das Datum hin.
                     # Du solltest außerhalb der Schleife mit BETWEEN arbeiten.

                Dafür kann ich nichts, so war es original.

                Ja und? Wenn Du es neu schreibst, dann mach es besser.
                Das hier ist katastrophale Codequalität.

                Between geht nicht,

                Selbstverständlich geht BETWEEN. Wenn die DB ein schlechtes Design aufweist,
                dann muss man halt zu Konvertierungen greifen. Geht auch.

                da man ja jeden Tag abfragen muss, auch in anderen Monaten, daher wurde die Schleife hier höchstwahrscheinlich so eingesetzt.

                das ist überhaupt gar kein Problem, definitiv nicht in diesem Codeabschnitt.

                [...]

                # Was bitte kommt jetzt?
                Abfrage der Datenbank, ob für den User ein event 'Urlaub' gespeichert ist und Festlegung der Darstellungsfarbe in der Variable 'farbe'

                Nein, kommt nicht.
                Hier, mitten in PHP steht

                  
                else {  
                    select an, datum, event, if(event='Urlaub','$holidays_color','blue') as farbe  
                
                

                Was bitte soll das sein?
                Eine Abfrage an die Datenbank?

                Wo sendest Du ein SQL-Statement an die Datenbank?
                Nirgends.

                Da steht etwas, was ähnlich wie ein SQL-Statement aussieht, mitten im PHP-Code.

                Es gibt die Fehlermeldung:

                Unexpected T_String ab else

                Du solltest Dein SQL-Statement als Zeichenkette an mysql_query() übergeben.
                Wo machst Du das?
                Habe ich da etwas übersehen?

                Ja selbstverständlich hast Du völlig unnötig Datenbankzugriffe innerhalb einer
                Schleife. Genau davon haben wir Dir abgeraten.
                Da das auf einem lokalen Server läuft, ist das doch eh egal.

                Mit diesem Argument kannst Du jede Verbesserung abwürgen.
                Dein Code ist schlecht strukturiert.

                Es ist grundsätzlich eine schlechte Idee, völlig unnötig eine Vielzahl von DB-Zugriffen in Schleifen vorzunehmen, wenn eine einzige reicht.

                Nochmals: solche Zugriffe sind verdammt teuer.
                Nein, ich weiß den genauen Faktor nicht.
                Aber gewöhne es Dir besser von Anfang an an, es richtig zu machen.

                Das da mag funzen[tm], mehr auch nicht. Gib Dich damit nicht zufrieden.

                • Nutze das Konzept der Funktionen.
                • Gehe großzügig mit dem Einsatz von Kommentaren um

                Das wären zumindest Möglichkeiten für die Zukunft.

                Bitte setze in Zukunft bei Deinen Postings Leerzeilen großzügiger ein.
                Sie machen Deine Beiträge viel leichter lesbar.

                Freundliche Grüße

                Vinzenz

                1. Hallo,

                  In der Theorie würde ich sagen: Man lässt als Array vorher alle events mit dem Titel 'Urlaub' und des entsprechenden Datums des jeweiligen Nutzers speichern und fragt in der Schleife nur noch ab, ob der befragte Tag im Array auftritt. Wenn ja, dann als Urlaub markieren, wenn nicht dann weiter im Text.
                  gruß aus Hosena

                2. Hallo,

                  In der Theorie würde ich sagen: Man lässt als Array vorher alle events mit dem Titel 'Urlaub' und des entsprechenden Datums des jeweiligen Nutzers speichern und fragt in der Schleife nur noch ab, ob der befragte Tag im Array auftritt. Wenn ja, dann als Urlaub markieren, wenn nicht dann weiter im Text.
                  gruß aus Hosena