Urlaubstage in MySql-Datenbank abfragen
xpfreund
- datenbank
0 Tom0 xpfreund0 Resultset erzeugen
Tom0 xpfreund0 Tom0 Vinzenz Mai
0 xpfreund
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
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
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
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
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 UrlaubDa 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 lassenselect 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." </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
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 UrlaubDa 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 lassenselect 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 </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
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." </div>";}
</code>
und das als Abfrage.
Trotzdem Danke für eure Hilfe.
gruß aus Hosena
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
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." </div>";}
// days with events = black
elseif ($row3[0] > 0 and !$view) {$da = "<div style='color:black; font-weight:bold;'>".$d." </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." </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." </div>";}
// normal day = blue
else { $da = $d." "; }
// 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> </td><td id=ri bgcolor=$bgcolor3><i><a href="javascript:dayweek(2, $year, $month, $da, '$sid')">$week_nr</a></i> </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
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")));
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." </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." </div>";}
// weekend
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." </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
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 dreimalEs 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." </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." </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." </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/)
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
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
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