Reservierungssystem für Squashplätze

martinhahn90

Grünschnabel
Servus,

ich habe vor, für meinen Squashverein ein Script zu programmieren, mit dem sich die Belegung der Squashplätze (Squashcourts) abfragen lässt bzw. angezeigt wird und sich Termine reservieren lassen.

Ich dachte mir zunächst, dass ich eine Buchung wie folgt abspeichere:
id | date | spieler1 | spieler2 | anfangszeit | endzeit | userid
1 | 25.03.2011 | martin fuchs | martin wolf | 09:30 | 10:30 | 8

Angezeigt auf der Seite würde dann z.B.:
08:00 - frei
08:30 - frei
09:00 - frei
09:30 - belegt
10:00 - belegt
10:30 - belegt
11:00 - frei

Allerdings weiß ich gar nicht, wie ich es hinbekommen soll, dass die Zeit 10:00 als belegt markiert wird. Anfangszeit und Endzeit kann ich auslesen.
Also dachte ich, mache ich für 08:00 die Prüfung: wenn zum datum von heute (25.03.2011) 08:00 in anfangszeit oder endzeit vorkommt, wird 08:00 als belegt markiert. Kommt 08:00 nicht vor, steht später dort: 08:00 - frei.
Das würde ich für jede Tabellenzeile so machen. Nur habe ich ja in der Tabelle lediglich den Anfangs- und Endwert stehen, nicht jedoch dazwischenliegende Zeiten.
Bei 10:00 käm also ein frei, obwohl diese Zeit ja mitgebucht wurde.

Mein Lösungsansatz:
Neben start- und endzeit gibt es noch eine gebuchte_uhrzeiten als Spalte in der Datenbanktabelle. Hier wird die startzeit und endzeit mit komma separiert eingetragen sowie alle zeiten ab startzeit + intervall (00:30) bis die endzeit erreicht ist.
In meinem Beispiel müsse dann in gebuchte_uhrzeiten stehen: 09:30, 10:30, 10:00

Nun ist meine Frage, wie ich das löse. Entweder genau auf die von mir beschriebene Art, da kenne ich die zu nutzenden Funktionen von PHP nicht - oder ob es nicht eine viel einfachere, praktikablere Lösung gibt.


Ich wäre euch wirklich dankbar, hättet ihr Lösungsansätze oder gar fertige Scripts für mich. Habe selber schon gesucht, allerdingsn ichts gescheites gefunden. Nur für die Reservierung von Ferienwohnungen, aber eben basierend auf Tagen und nicht auf halben Stunden-Intervallen.


Martin
 
Hallo,

wenn du die Anfangszeit und Endzeit z.b.: als Timestamp speicherst und nicht nur als 10:00, kannst du mit between abfragen, ob zu einem gewissen Zeitpunkt z.b.: am 25.03.2011 um 10:00 der Platz frei ist oder belegt.
 
Ich war ganz überrascht, das ich in meinem Wiki keine Lösung fand. Also habe ich die Zeit genutzt, einen Lösungsansatz in mein Wiki zu schreiben (Inkl. Erklärbär)

Das ganze mit erklärung: MySQL Belegungsplan

Es sieht wilder aus, als es ist
SQL:
SELECT
    datum,
    object_id,
    startzeit AS perioden_start,
    IF(SUM(state), 'belegt', 'frei') AS gebucht,
    MAX(user_id) AS user_id
FROM
    (
        SELECT
            var.datum,         
            per.startzeit,
            per.object_id,
            @state := TIMESTAMP(var.datum, per.startzeit) BETWEEN bel.anfangszeit AND bel.endzeit AS state,
            IF(@state, bel.user_id, NULL) AS user_id
        FROM
            -- hier kann man auch ein beliebiges anderes Datum (ohne Zeitstempfel) setzen
            (SELECT CURDATE() AS datum) AS var,
            (
                --Alle Perioden mit allen Objekten kombiniern
                SELECT
                    startzeit,
                    objekte.id AS object_id
                FROM
                    perioden,
                    objekte
            ) AS per
            --Diese Kombination mit den Belegungen erweitern
            LEFT JOIN belegung AS bel
                ON bel.object_id = per.object_id
    ) AS rohdaten
GROUP BY
    object_id,
    startzeit,
    datum
 
Zuletzt bearbeitet von einem Moderator:
Zurück