Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] merkwürdiges BETWEEN datumsabfrage Problem

Einklappen

Neue Werbung 2019

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

  • [Erledigt] merkwürdiges BETWEEN datumsabfrage Problem

    Hallo Leute,

    ich habe ein Problem was ich rei gar nicht verstehe. Ich habe eine Tabelle mit Anreise und Abreise Datum für Zimmerbuchungen, beide Felder haben den Feldtyp Date.

    Wenn ein Eintrag gemacht wird stehen die Datumseingaben die sich aus Formularfeldern ergeben korrekt so drin in der Tabelle.

    Code:
    anreise 2009-04-05
    abreise 2009-04-11
    So und nun habe ich bei dem ersten Buchungsschritt eine Checkabfrage gemacht ob das Zimemr in diesem Bereich überhaupt Buchbar ist.

    Und da tritt ein Problem auf was ich mir nicht wirklich erklären kann!

    Hier mal der abfrage code
    PHP-Code:
    //abfragen aus der buchungstabelle machen nach zimmer und anr wie abr datum
     
    $sqlbefehl ="
        Select
         id_buch,
         zimmer,
         anreise,
         abreise
        From
         buchungen
        Where
         anreise
        BETWEEN
         
    $date_anr
        AND
         
    $date_abr
        AND
         MATCH (zimmer) AGAINST ('"
    .mysql_real_escape_string($zimmer)."' IN BOOLEAN MODE)
        "
    ;
     
    $erg_check mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
     
    //checken ob zimmer in dem zeitbereich gebucht ist
     
    if(mysql_num_rows($erg_check)>0)
     {
      
    $error['check'] = 'Zimmer ist in diesem Zeitraum nicht buchbar!';
     }
     
     
    //wenn kein fehler dann variablen in session vars schreiben
     
    if(!$error)
     {
     
      die(
    $sqlbefehl);

    So ich ahbe es mal nur auf das nötigste beschränkt, denn wenn was eingetragen wird passt das auch. Nun beim testen habe ich bemerkt das die Abfrage nicht greift beim vorkommen einer buchung und habe mir zum debuggen mal nach dem absenden den sql-string ausgeben lassen. Und das Ergebniss ist nun aber überraschend und will mir nicht in den Kopf.

    Hier Debugging Ausgabe
    Select id_buch, zimmer, anreise, abreise From buchungen Where anreise BETWEEN 2009-4-05 AND 2009-4-11 AND MATCH (zimmer) AGAINST ('Zimmer 3' IN BOOLEAN MODE)
    Wie Ihr sehen könnt fehlt eine 0 bei der Monatsangebe, aber in der Tagesangabe ist die 0 da.

    Und was mich noch mehr irritiert ist, das bei einem Eintrag das Datum in beiden Feldern korrekt in der DB steht.

    Kann mir da einer weiterhelfen woran das liegt?

    Danke sehr f+r die Hilfe mfg litter
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    [URL]http://www.lit-web.de[/URL]

  • #2
    Woher kommt denn $date_anr? Wahrscheinlich formatierst du das doch selbst - warum wunderrt es dich dann wie es formatiert ist?

    Deine Abfrage ist auch nicht optimal - so bekommst du jedenfalls nicht raus, ob ein Zimmer im gegebenen Zeitram frei ist. (Zum Beispiel wenn das Zimmer vom 01.01.2010 bis zum 01.02.2010 bereits belegt ist und du mit einem Anreisedatum 10.01.2010 und einem Abreisedatum 20.01.2010 prüfst...)
    [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

    Kommentar


    • #3
      Ja das datum stellt sich aus Formularfeldern raus. Und was ich schon schrieb wenn ich es in die DB eintrage dann steht es korrekt drin wie im Post zu sehen. Nur im debugging des Selects tritt ein Fehler auf und das verstehe ich nicht.

      Hm wegen der Prüfung gebe ich dir Recht. Wie könnte ich das besser machen?

      Gruß litter
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      [URL]http://www.lit-web.de[/URL]

      Kommentar


      • #4
        Zitat von litterauspirna Beitrag anzeigen
        Ja das datum stellt sich aus Formularfeldern raus. Und was ich schon schrieb wenn ich es in die DB eintrage dann steht es korrekt drin wie im Post zu sehen. Nur im debugging des Selects tritt ein Fehler auf und das verstehe ich nicht.
        Dann kommt MySQL ganz offensichtlich mit diesem Datumsformat klar Wenn du es trotzdem lieber mit führender Null bei den Monaten haben willst, dann musst du das eben entsprechend in deinem Code ändern...

        Hm wegen der Prüfung gebe ich dir Recht. Wie könnte ich das besser machen?
        Überleg dir einfach welche Konstellationen auftauchen können. Mal es dir am besten auf ein Blatt Papier auf. Danach ist es ganz einfach die Logik kurz in SQL zu übertragen.
        [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

        Kommentar


        • #5
          Ok also den Fehler in dem Datumsformat konnte ich beseitigen, das war ein Fehler in der deklaration der Array keys.

          Zu dem anderen Thema, nunja ich habe mir das schon überlegt, aber scheinbar Fehlerhaft. Wenn jemand nun ein Zimmer buchen will im Datumszeitraum z.B. vom 2009-04-05 bis 2009-04-11 dann muss ich in der Abfrage prüfen ob das zimmer ebend genau in dem Zeitraum gebucht wurde, das heist einmal anreise und abreise Datum checken.

          Oder habe ich da nicht richtig überlegt?

          Im Prinzip fehlt ja nur noch ein Check mit BETWEEN auf die abreise bezogen?

          Ich habe nun folgenden Code
          PHP-Code:
          //abfragen aus der buchungstabelle machen nach zimmer und anr wie abr datum
           
          $sqlbefehl ="
              Select
               id_buch,
               zimmer,
               anreise,
               abreise
              From
               buchungen
              Where
               anreise >= '"
          .$date_anr."'
              AND
               abreise <= '"
          .$date_abr."'
              AND
               zimmer= '"
          .mysql_real_escape_string($zimmer)."'
              "
          ;
           
          $erg_check mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
           
          //checken ob zimmer in dem zeitbereich gebucht ist
           
          if(mysql_num_rows($erg_check) >0)
           {
            
          $error['check'] = 'Zimmer ist in diesem Zeitraum nicht buchbar!';
           } 
          Diese funktioniert aber nur wenn genau das Datum zutrifft was gewählt wurde. Wenn ein Datum im Zwischenraum liegt wird das nicht mehr abgearbeitet wie es soll und es wird etwas eingetragen obwohl das gar nicht sein dürfte.
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          [URL]http://www.lit-web.de[/URL]

          Kommentar


          • #6
            Nein, ganz so einfach ist es nicht. Wenn man es sich aufmalt fällt es einem viel leichter: Angenommen wir haben ein Zimmer und das ist vom 01.04.09 bis zum 01.05.09 belegt:

            Dann sind das gelb eingezeichnete die "Buchungswünsche" die nicht mehr möglich sind. Es sind also 4 Fälle die du beachten musst. Die ersten drei kannst du damit erschlagen, dass du prüfst ob Start- oder Enddatum der gewünschten Buchung zwischen Start und Ende der Belegung liegen. Den letzen indem du zum Beispiel zusätzlich noch prüfst ob das Startdatum der vorhandenen Belegung zwischen gewünschten Start- und Endedatum liegt.
            [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

            Kommentar


            • #7
              Den letzen indem du zum Beispiel zusätzlich noch prüfst ob das Startdatum der vorhandenen Belegung zwischen gewünschten Start- und Endedatum liegt.
              Ich bin nicht sicher, ob das bei 5 Zeitschlitzen auch noch gültig ist.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Du musst nur den umgekehrten Fall abtesten und dann negieren.

                Kommentar


                • #9
                  Hallo Leute ich ahbe es nun mittlerweile geschafft.

                  Hier mal der Code der Funktioniert und alles abdeckt. Habe das in verschiedenen Fällen abgetestet und das Erbegnis war was ich wollte.

                  PHP-Code:
                  //abfragen aus der buchungstabelle machen nach zimmer und anr wie abr datum
                   
                  $sqlbefehl ="
                      Select
                       id_buch,
                       zimmer,
                       anreise,
                       abreise
                      From
                       buchungen
                      Where
                       ((anreise >= '"
                  .$date_anr."'
                      and
                       anreise <= '"
                  .$date_abr."'
                      )or(
                       abreise >= '"
                  .$date_anr."'
                      and
                       abreise <= '"
                  .$date_abr."'
                      ))AND
                       zimmer= '"
                  .mysql_real_escape_string($zimmer)."'
                      "
                  ;
                   
                  $erg_check mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
                   
                  //checken ob zimmer in dem zeitbereich gebucht ist
                   
                  if(mysql_num_rows($erg_check) >0)
                   {
                    
                  $error['check'] = 'Das '.$zimmer.' ist in diesem Zeitraum leider schon ausgebucht!';
                   } 
                  Danke für eure hilfereichen Anregungen. Gruß litter
                  Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                  [URL]http://www.lit-web.de[/URL]

                  Kommentar

                  Lädt...
                  X