Problem mit Zeitauswahl bei Terminbuchung

pkuttner

Grünschnabel
Hallo!

Ich habe eine MySQL Datenbank mit unter anderem folgenden Tabellen:
- Buchungen (ID, IDUser, Datum, Von, Bis)
- ZeitenVon (ID, Zeit) > 08:00, 09:00, ... 21:00
- ZeitenBis (ID, Zeit) > 09:00, 10:00, ... 22:00

Nun werden die Dropdown-Felder (von, bis) mit den Werten aus der Tabelle Zeiten gefüllt.

Der User kann nun mittels einen Kalender den gewünschten Tag auswählen und kommt nun zu der Seite, wo er die Zeiten auswählen kann.
Wenn nun bereits eine Reservierung (zB von einem anderen User) vorhanden ist, dann sollen diese bereits reservierten Zeiten nicht mehr zur Verfügung stehen.

Ich habe habe es bereits mit folgendem Code versucht:
PHP:
$ergebnis = mysql_query("SELECT z.ID, z.Zeit, b.Datum, b.Von, b.Bis FROM ZeitenVon z, Buchungen b WHERE b.Datum = '$date' AND z.Zeit NOT BETWEEN b.Von And b.Bis ORDER BY z.Zeit ASC");

Beispiel: Reservierung am 20.09.2012 von 10:00 bis 12:00 bereits vorhanden.
User wählt jetzt auch den 20.09.2012.
Nun sollten im Dropdown-Feld "Von" nur noch die Zeiten 08:00, 08:30, 09:00 und 09:30 sowie 12:00 bis 22:00 vorhanden sein.
Und im Dropdown-Feld "Bis" nur noch die Zeiten 09:00, 09:30, 10:00 und dann alle Zeiten ab 12:00 wieder.

Dies ist jedoch nicht der Fall, da durch das NOT BETWEEN ja auch die Zeiten 10:00 und 12:00 ausgeschlossen werden.
Es sollte jedoch möglich sein, auch noch von 08:00 bis 10:00 Uhr zu buchen und wieder ab 12:00 und nicht erst ab 12:30.

Wenn dann eine zweite Reservierung vorhanden ist, sind plötzlich in den Dropdown-Felder manche Zeiten doppelt vorhanden.

Kann mir jemand bei diesem Problem helfen?

Danke, LG
 
Da du innerhalb der Datenbank eh mit IDs arbeitest, kannst du diese doch einfach an den entsprechenden Stellen um eins (1) vermindern, dann sollte das Problem aus der Welt geschaffen sein?

Ich gehe davon aus, dass sowohl Buchungen für 1h als auch für 2,3,4,... 10h möglich sind. Wenn die Zeitspanne immer gleich sein muss/ist, dann könntest du ja auch auf fertige Zeitspannen zurückgreifen. Allerdings rate ich davon im besagten Fall doch eher ab.

@Registrierer: Offtopic geputzt
 
Zuletzt bearbeitet von einem Moderator:
Ja es ist theoretisch möglich, auch 10h zu reservieren. Genauso ist es möglich, 1.5 Stunden zu reservieren.
Zwingend ist eine Stunde, dann kann man im Halbe-Stunden-Takt aufwärts reservieren.

Was genau meinst du damit? - zu welchem Punkt genau?
Da du innerhalb der Datenbank eh mit IDs arbeitest, kannst du diese doch einfach an den entsprechenden Stellen um eins (1) vermindern, dann sollte das Problem aus der Welt geschaffen sein?

Es müsste nicht mal mit Dropdown-Menüs sein, hauptsache man kann die bereits reservierten Zeiträume nicht buchen (nicht sichtbar in der Auswahl)
 
- ZeitenVon (ID, Zeit) > 08:00, 09:00, ... 21:00
- ZeitenBis (ID, Zeit) > 09:00, 10:00, ... 22:00

Das sollen zwei Tabellen sein? Welchen Sinn haben die?
 
Dort stehen die möglichen Anfangs- und Endtermine drin, so wie ichs verstanden habe.

pkuttner hat gesagt.:
Was genau meinst du damit? - zu welchem Punkt genau?
Wenn du bereits einen Termin von 8:00-10:30 hast, dann kannst du ja ab 10.30 bereits wieder einen buchen, was zurzeit aber nicht geht.

In der Datenbank trägst du bei den Buchungen ja nicht 8:00 als Start und 10:30 als Ende ein, sondern die ID der jeweiligen Uhrzeit aus der anderen Tabelle (z.B. 1 und 5).
Wenn bei dir Ende ID5 ist und Anfang auch ID5, gehts nicht. Also versuch doch, bei den vorhandenen Einträgen die ID hier zu verringern, damit diese Uhrzeit als frei angezeigt wird. Denn dann liegt sie nicht mehr innerhalb des nächsten Termins.

Gruß
 
Und wie soll dann eine mindestens anderthalbstündige reservierung gewährleistet werden (siehe frühster Von und frühster Bis-Wert)? Und wie soll das mit dem halbstündigen reservieren funktionieren, wenn dort nur volle Stunden aufgelistet sind?

eine tabelle reicht mMn:

ID(int) | IDUser(int) | start(Datetime) | end(Datetime)
 
Ok, also zurzeit werden die Uhrzeiten in die Tabelle eingetragen, nicht die IDs.
Wie wird es dann gelöst, wenn bereits mehrere Reservierungen vorhanden sind?

Halbe Stunden können auch ausgewählt werden, die habe ich leider nur vergessen zu schreiben.
Die beiden Tabellen habe ich deswegen erstellt, dass bei der Bis-Zeit 08:00 und 08:30 Uhr gar nicht angezeiget wird, und wiederum bei der Von-Zeit auch kein 21:30 und 22:30
 
Du musst eindeutiger arbeiten und nicht die Uhrzeit übernehmen, sondern nur die IDs. Sonst machen die Tabellen auch keinen Sinn.
Wie du mit mehreren Terminen umgehst weiß ich nicht, ich hab noch keine Erfahrung mit dem BETWEEN-Statement.

Warum überhaupt Tabellen mit Uhrzeiten?
Eigentlich ne simple Lösung: Stell dir vor, du hast zig tausend Einträge. Dann ist so ein Timestamp/Datetime doch viel speicherlastiger als ne kleine ID. Sparst viel an Redundanz.
 
Zurück