In deinem Fall sind die Daten auf 2 Tabellen aufgeteilt, und du musst sie dir erstmal zusammensuchen (i.e. JOINen). Bei der Darstellung der Daten kommt dann ein Gruppenbruchverfahren zum Einsatz.
Also:
- Selektiere 'user'
- joine 'urlaub' über 'urlaub.user_id = user.id'
- sortiere das Ergebnis nach 'user_id'
Im Ergebnis stehen dann alle Urlaubstermine eines Benutzers hintereinander (innerhalb eines Benutzers allerdings unsortiert, d.h. es wurde nicht noch nach 'von' oder 'bis' sortiert).
Für jeden Datensatz des aktuellen Users (untersucht werden die hinzugejointen Felder 'von' und 'bis', aber der Gruppenbruch ist nach dem User ausgerichtet) kannst du die Übersicht des aktuellen Monats befüllen, den du anzeigen lassen willst. D.h. du schaust in jeden Datensatz, für jeden Datensatz durchläufst du die "Monatsschleife" und
prüfst, ob aktueller Tag >= von bzw. aktuellerTag <= bis ist. Sofern beides zutrifft, darfst du ein Kreuzchen machen.
Schematisch:
Code:
SELECT ... FROM users
INNER JOIN urlaub
ON users.ID = urlaub.user_ID
// hier kann noch eine Einschränkung gemacht werden, so das nur Termine gefunden werden, wo 'von' bzw. 'bis' innerhalb des darzustellenden Monats ist...
$lastUserId = null; // für den Gruppenbruch
while ($row = fetch_assoc()) {
if ($lastUserId != $row['user_id']) { // hier beginnt der Gruppenbruch
// hier beginnt eine neue Zeile mit dem Namen des Users
// dann kommen die Spalten, für jeden Tag des Monats eine
for($t = 1; $t < 31; $t++) { // Monatsschleife für den aktuell anzuzeigenden Monat.. verbesserungswürdig
// Liegt der aktuelle Tag ($t.7.2001, für $t >= 1 && $t <=31) zwischen von und bis?
if (mktime(0, 0, 0, 7, $t, 2011) >= $row['von'] && mktime(...) <= $row['bis'])
echo 'X'; // Kreuzchen machen
}
}
$lastUserId = $row['user_id'];
}