Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankarrays zeilenweise vergleichen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankarrays zeilenweise vergleichen

    Hallo Leute

    Ich steh vor einem mir unlösbaren Problem.
    Ich programmiere für meinen Tischtennisverein eine Online-Reservierungsseite.
    So siehts aus:

    Ich habe 6 Tischtennisplatten, welche jeweils zur selben Zeit reserviert werden können.
    Sind zu einem Zeitpunkt alle 6 Platten bereits belegt, soll eine Anweisung ausgegeben werden "keine Platte zum Zeitpunkt frei".
    Andernfalls soll die Reservierung in eine Datenbank für eine noch freie Platte gesetzt werden.

    Die Zeiten werden mit Hilfe einem HTML-Seite abgefragt, mittels POST übergeben und als Timestamp in die Datenbank geschrieben.
    Ich vermute, ich muss die ganze Geschichte mit einem Array auslesen und das Array dann (ähnlich wie die If-Anweisung unten) mit den Zeiten vergleichen.

    Ich habe bereits folgenden Quelltext erarbeitet:

    PHP-Code:
    <?php
    // Übergabe der Eingabewerte
    $auswahl mysql_escape_string($_POST['auswahl']);
    $restisch mysql_escape_string($_POST['restisch']);
    $tag mysql_escape_string($_POST['tag']);
    $monat mysql_escape_string($_POST['monat']);
    $jahr mysql_escape_string($_POST['jahr']);
    $stunde mysql_escape_string($_POST['stunde']);
    $minute mysql_escape_string($_POST['minute']);
    $dauer mysql_escape_string($_POST['dauer']);
            
    // Timestamp erzeugen
    $time_now time();
    $time_start mktime($stunde$minute0$monat$tag$jahr);
    $time_end $time_start + ($dauer*60*60);

    $sql "INSERT INTO allrestisch (id_restisch, restisch, timestamp_start, timestamp_end, timestamp_now) 
            VALUES (\"
    $auswahl\", \"$restisch\", \"$time_start\", \"$time_end\", \"$time_now\")";


    $sql_start="SELECT timestamp_start FROM allrestisch";
    $sql_end="SELECT timestamp_end FROM allrestisch";

    $timestamp_start=mysql_query($sql_start);
    $timestamp_end=mysql_query($sql_end);

    $i=0;
    while(
    $i<=25)
     {    
        
        if(
            ((
    $time_start<$timestamp_start) & ($time_end<$timestamp_start)) & (($time_start<$timestamp_end) & ($time_end<$timestamp_end))
            || 
            ((
    $time_start>$timestamp_start) & ($time_end>$timestamp_start)) & (($time_start>$timestamp_end) & ($time_end>$timestamp_end))
        )
        {
            echo 
    "Reservierung wurde gesetzt".'<br />';
            
    mysql_query($sql);
        }
        else
        {
            echo 
    "es liegt leider schon eine Reservierung vor".'<br />';
            
        }; 
    $i++;


    }
    ?>
    Ich bin sehr dankbar für einen kleinen Stoß in die richtige Richtung.

  • #2
    Meine Antwort passt jetzt nicht ganz zu Deiner Frage, aber mir scheint, Du solltest Dein Datenmodell nochmal überdenken. Spontan fällt mir folgende Vorgehensweise und Datenmodell ein...(passt allerdings gar nicht zu Deinem bisherigen Programm, ist aber vielleicht eine Überlegung wert).

    Code:
    /**
    * Stammdaten verfügbare Tische (1 bis x)
    */
    CREATE TABLE tisch (
      tisch_id INT NOT NULL
    )
    
    CREATE TABLE tisch_reservierung (
      id INT NOT NULL,
      tisch_id INT NOT NULL,
      von TIMESTAMP NOT NULL,
      bis TIMESTAMP NOT NULL
    )
    
    /**
    * aktuell reservierte Tische
    */ 
    SELECT tisch_id 
      FROM tisch_reservierung
     WHERE CURRENT_TIMESTAMP BETWEEN von AND bis
     
    /**
    * aktuell freie Tische
    */
    SELECT tisch_id FROM tisch
      WHERE tisch_id NOT IN ( SELECT tisch_id 
                                FROM tisch_reservierung
                               WHERE CURRENT_TIMESTAMP BETWEEN von AND bis)
                               
    /**
    * aktuelle Anzahl freie Tische => liefert 0, wenn nichts mehr frei ist.
    */
    SELECT COUNT(*) FROM tisch
      WHERE tisch_id NOT IN ( SELECT tisch_id 
                                FROM tisch_reservierung
                               WHERE CURRENT_TIMESTAMP BETWEEN von AND bis)
    So, ich hoffe ich habe keine Tippfehler drin..(soweit mal mein Brainstorming)

    Grüße
    Thomas

    Kommentar


    • #3
      Vielen Dank für die schnelle Antwort.
      So ähnlich probier ich das gleich mal einzuarbeiten.

      Kommentar


      • #4
        Hallo Thomas, hi Leute.
        Ich habe jetzt mal den Vorschlag versucht, und habe die Rechenarbeit von der MySQL-Datenbank durchführen lassen. Das Problem ist allerdings, dass der Vorschlag mit den SQL-Befehl BETWEEN so eigentlich nur ein Zeitpunkt mit einem Zeitraum und nicht ein Zeitraum mit einem Zeitraum abgefragt werden kann. Hat mir so leider nicht weitergeholfen. Trotzdem danke.
        Theoretisch müsste ich irgendwie den Zeitraum von meiner Eingabe mit dem Zeitraum in der Datenbank vergleichen und so meine freien Zeiten rausfiltern. Ich denke der Ansatz von der Grundidee (Siehe beitrag ganz oben) ist nicht so falsch. Ich kann nur die vielen zurückgelieferten Daten nicht vernünftig verarbeiten. Hat da evtl. jemand eine Idee.

        Kommentar


        • #5
          Abgesehen davon, das du nach dem Zeitpunkt gefragt hattest, muss die Abfrage halt umgestellt werden.

          Wenn Res.Startzeit >= Tisch.Startzeit UND Res.Endzeit =< Tisch.Endzeit liegt der gewünschte Reservierungszeitraum gänzlich in einem reservierten Zeitraum.

          Wenn die Res.Startzeit < Tisch.Startzeit UND Res.Endzeit >= Tisch.Startzeit überschneidet sich der Zeitraum "vorne"

          Wenn Res.Startzeit < Tisch.Endzeit UND Res.Endzeit >= Tisch.Endzeit überschneidet sich der Zeitraum "hinten"


          (hoffentlich richtig )
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Einen freien Zeitbereich sicherzustellen ist schon etwas komplizierter. Das könnte in etwa so sein. In der folgenden Abfrage werden quasi alle "vier Ecken" geprüft. Mal so aus dem Bauch heraus...

            angefragter Zeitraum: $anfrage_von $anfrage_bis

            Code:
            /**
            * aktuell freie Tische
            */
            SELECT tisch_id FROM tisch
              WHERE tisch_id NOT IN ( SELECT tisch_id 
                                        FROM tisch_reservierung
                                       WHERE $anfrage_von BETWEEN von AND bis)
                AND tisch_id NOT IN ( SELECT tisch_id 
                                        FROM tisch_reservierung
                                       WHERE $anfrage_bis BETWEEN von AND bis)
                AND tisch_id NOT IN ( SELECT tisch_id 
                                        FROM tisch_reservierung
                                       WHERE von BETWEEN $anfrage_von AND $anfrage_bis)  
                AND tisch_id NOT IN ( SELECT tisch_id 
                                        FROM tisch_reservierung
                                       WHERE bis BETWEEN $anfrage_von AND $anfrage_bis)
            Die Variablen $anfrage_von und $anfrage_bis müssen eventuell mit '$anfrage_bis' oder als bindParam() eingebunden werden. Das hängt von Deinem Programm ab.

            Grüße
            Thomas

            Kommentar


            • #7
              Hallo Leute. Das ist so schon richtig - hierfür nochmals meinen aufrichtigen Dank.
              Dennoch frage ich keinen Zeitraum mit einem Zeitraum ab:

              Einfaches Beispiel: In der Datenbank wurde bereits von 12 bis 14 Uhr ein Tisch reserviert.
              Kommt nun eine weitere Anfrage von 10 bis 13, so liegt der Wert 13 zwischen 12 und 14 und somit trifft eine Überschneidung zu, genauso verhält es sich ja mit einer weiteren Reservierungsanfrage von 13 bis 15 Uhr. Aber was passiert wenn jemand eine Anfrage von 10 bis 15 Uhr stellt? Dann ist keiner der beiden Werte zwischen 12 und 14 zu finden und die Datenbank denkt, es gibt keine Überschneidung.
              Kann man nicht irgendwie einen SQL-Befehl schnitzen der irgendwie so aussieht:
              PHP-Code:
              SELECT tisch_id FROM tisch 
              WHERE tisch_id 
              ($anfrage_start BETWEEN $anfrage_endBETWEEN (sql_start BETWEEN sql_end
              (natürlich sieht das jetzt etwas abenteuerlich aus - ich hoffe ihr versteht ungefähr was ich meine, um zwei Zeiträume miteinander zu vergleichen)!
              Besser wäre evtl. irgendwie die Sache aus der Datenbank auszulesen und mittels array abzuarbeiten - aber da weiß ich ja blöderweise nicht weiter!

              Kommentar


              • #8
                Hast Du meinen SQL ausprobiert und verstanden? Eigentlich bin ich der Meinung, der macht dass was Du möchtest.

                Ansonsten kannst Du ja mal Deine Original CREATE TABLE mit ein paar Testdaten liefern. Dann können wir alle damit testen.

                Grüße
                Thomas

                Kommentar


                • #9
                  Hallo Thomas.
                  Danke für deine Antwort.
                  Habs versucht und hat funktioniert.
                  Echt fettes merci.

                  Kommentar

                  Lädt...
                  X