Mathiis: [MySQL/PHP]Checken von Eingabe- und vorhandenen DB-Daten

Hallo,

ich bin zur Zeit dabei ein Checksystem für einen Terminkalender zu erstellen.
WEnn man einen Termin einträgt, hat er Attribute, wie Anfangs- und Endzeit, Tag, Art, usw.
Wenn ich jetzt einen neuen Termin anlegen möchte, will ich vorher checken, ob dort nicht schon ein Termin vorhanden ist.

Ich komme im Moment nur nicht so ganz drauf, wie ich es machen soll.
Also die Abfrage der Termine, die an dem Tag schon vergeben sind, klappt, nur der Vergleich mit den eingegebenen Daten hinkt.

Würd mich freuen, wenn mir jemand nen Denkanstoß geben kann.

Gruß

Mathiis

  1. Hallo,

    Also die Abfrage der Termine, die an dem Tag schon vergeben sind, klappt, nur der Vergleich mit den eingegebenen Daten hinkt.

    Das ist keine Problembeschreibung! Woher sollen "wir" wissen

    a) was "hinken" bei dir bedeutet
    b) was genau "hinkt"

    ??

    Würd mich freuen, wenn mir jemand nen Denkanstoß geben kann.

    Anstoss: Mach eine Datenbankabfrage mit den übergebenen Werten vom Formular / von der Eingabe in der WHERE Klausel und schaue, ob es Datensätze gibt, die den vorgegebenen (von der Eingabe) Werten entsprechen. (Tipp: Das ist dann womöglich der Fall, wenn Datensätze zurückgegeben werden, also die mysql Resource nicht leer ist.)

    Ciao, Frank

  2. Hallo,

    ich bin zur Zeit dabei ein Checksystem für einen Terminkalender zu erstellen.
    WEnn man einen Termin einträgt, hat er Attribute, wie Anfangs- und Endzeit, Tag, Art, usw.
    Wenn ich jetzt einen neuen Termin anlegen möchte, will ich vorher checken, ob dort nicht schon ein Termin vorhanden ist.

    Ich komme im Moment nur nicht so ganz drauf, wie ich es machen soll.
    Also die Abfrage der Termine, die an dem Tag schon vergeben sind, klappt, nur der Vergleich mit den eingegebenen Daten hinkt.

    Würd mich freuen, wenn mir jemand nen Denkanstoß geben kann.

    Gruß

    Mathiis

    Du kannst sowohl mittels (My)SQL als auch per PHP eine solche Prüfung implementieren.

    Ein Ansatz in SQL:

    Seien "new_start_time" und "new_end_time" Variablen in einer Stored Procedure oder einem Trigger:

      
    SELECT id FROM my_table m  
        WHERE new_start_time BETWEEN m.start_time AND m.end_time  
              OR new_end_time BETWEEN m.start_time AND m.end_time  
        /* ggf. weitere AND Bedingungen,  
           z.b: nach user_id o.ae. */ ;  
    
    

    Wenn die Ergebnismenge nicht leer ist, liegt eine Kollision vor.

    Wenn, wie nahe liegend, auf weitere Bedingungen geprüft werden muss um eine Kollision zu erkennen, sollte die Query geeignet umsortiert werden; z.B. auf "user_id", falls vorhanden INT, würde ich instinktiv zuerst prüfen.

    Mit Platzhaltern "new_start_time" und "new_end_time" kannst Du die Query auch via PDO oder anderen PHP DB-Schnittstellen ausführem.

    Bei weiteren Fragen bitte unbedingt

    • Plattform und MySQL-Version(Ganz wichtig!)
    • PHP Version und Einsatzart (mod_php, ISAPI, CGI)
    • ggf. Quellcode

    mit posten!

    Grüsse

    "Solkar"

    1. Streiche:

      Mit Platzhaltern "new_start_time" und "new_end_time" kannst Du die Query auch via PDO oder anderen PHP DB-Schnittstellen ausführem.

      Setze:

      Mit Platzhaltern STATT "new_start_time" und "new_end_time" kannst Du die Query auch via PDO oder anderen PHP DB-Schnittstellen ausführem.

      1. Streiche:

        Mit Platzhaltern "new_start_time" und "new_end_time" kannst Du die Query auch via PDO oder anderen PHP DB-Schnittstellen ausführem.

        Setze:

        Mit Platzhaltern STATT "new_start_time" und "new_end_time" kannst Du die Query auch via PDO oder anderen PHP DB-Schnittstellen ausführem.

        Hallo,
        habe mir nun eine Select Anfrage mit between aufgebaut.
        Aber so gan will das noch nicht funktionieren.

        $query = "SELECT termin_id
           FROM cisco_weekplan_termin m
           WHERE termin_tag = '".$form["tag"]."'
           AND termin_raum = '".$session->get_user_raum()."'
           AND (termin_kind = 1
           OR termin_kind = 2)
           AND '".$form["anf_std"]."'
           BETWEEN m.termin_anf_std
           AND m.termin_end_std
           OR '".$form["end_std"]."'
           BETWEEN m.termin_anf_std
           AND m.termin_end_std";
         $dummy = sql_query($query);
         //$check = db_result($dummy);
         echo $dummy;

        Das Ergebnis für dummy lautet: Resource id #27
        Diese ID ist jedoch nicht vergeben in meiner Tabelle...
        Wo liegt mein Fehler?

        Entwicklungsumgebung ist übrigens XAMPP 1.67

        1. Ich weiß zwar nicht, was die funktion sql_query() bei dir macht ... ich nehme mal an das gleiche wie mysql_query(). d.h. es muss danach noch ein fetch kommen:
          a) mysql_fetch_arry()
          b) mysql_fetch_row()
          c) irgendeine andere variante

          Wenn du wissen willst ob die SQL-Syntax stimmt mach vor der zeile $dummy = ....; ein echo $query; und was da raus kommt gibts du mal im phpMyAdmin ein.

          ps: xampp 1.67 ist schon nett, aber wir bräuchten die mysql version

          1. Ich weiß zwar nicht, was die funktion sql_query() bei dir macht ... ich nehme mal an das gleiche wie mysql_query(). d.h. es muss danach noch ein fetch kommen:
            a) mysql_fetch_arry()
            b) mysql_fetch_row()
            c) irgendeine andere variante

            Wenn du wissen willst ob die SQL-Syntax stimmt mach vor der zeile $dummy = ....; ein echo $query; und was da raus kommt gibts du mal im phpMyAdmin ein.

            ps: xampp 1.67 ist schon nett, aber wir bräuchten die mysql version

            Hallo, die Versionsnummern lauten:

            Apache HTTPD 2.2.9 + Openssl 0.9.8h

            MySQL 5.0.51b

            PHP 5.2.6

            PHP 4.4.8

            phpMyAdmin 2.11.7

            So, habe dei SQL Syntax getestet. Die funktioniert auch richtig.
            Nur irgendwie bekomme ich es nicht hin, dass ich eine ordentliche
            FALSE Meldung bekomme, wenn der Termin frei ist, bzw, wenn die Abfrage kein Ergebnis liefert.

            $query = "SELECT termin_id
               FROM cisco_weekplan_termin
               WHERE termin_tag = '".$form["tag"]."'
               AND termin_raum = '".$session->get_user_raum()."'
               AND (termin_kind = 1
               OR termin_kind = 2)
               AND '".$form["anf_std"]."'
               BETWEEN termin_anf_std
               AND termin_end_std
               OR '".$form["end_std"]."'
               BETWEEN termin_anf_std
               AND termin_end_std";
             $dummy = sql_query($query);
             $check = mysql_fetch_array($dummy);

            if($dummy==FALSE){

            $insert = array('termin_fach'=> $session->get_user_fach(),
               'termin_class'=> 0,
               'termin_raum'=> $session->get_user_raum(),
               'termin_anf_std'=> $form["anf_std"],
               'termin_anf_min'=> $form["anf_min"],
               'termin_end_std'=> $form["end_std"],
               'termin_end_min'=> $form["end_min"],
               'termin_tag'=> $form["tag"],
               'termin_kind'=> $kind,
               'termin_ver'=> 2
                       );
              $sql = make_sql_insert('cisco_weekplan_termin',$insert);
              sql_query($sql);

            $starthour=$form["anf_std"];
              $endhour=$form["end_std"];

            for($hour=$starthour;$hour<$endhour;$hour++){

            $del = "DELETE FROM cisco_weekplan_termin
                WHERE termin_kind = '3'
                AND termin_raum =
                                            '".$session->get_user_raum()."'
                AND termin_tag = '".$form["tag"]."'
                AND termin_anf_std = '".$starthour."'";
              sql_query($del);

            $starthour=$starthour+'01';
                    }

            return true;
              }else
              return -1;
             }

            1. Ich weiß zwar nicht, was die funktion sql_query() bei dir macht ... ich nehme mal an das gleiche wie mysql_query(). d.h. es muss danach noch ein fetch kommen:
              a) mysql_fetch_arry()
              b) mysql_fetch_row()
              c) irgendeine andere variante

              Wenn du wissen willst ob die SQL-Syntax stimmt mach vor der zeile $dummy = ....; ein echo $query; und was da raus kommt gibts du mal im phpMyAdmin ein.

              ps: xampp 1.67 ist schon nett, aber wir bräuchten die mysql version

              Hallo, die Versionsnummern lauten:

              Apache HTTPD 2.2.9 + Openssl 0.9.8h

              MySQL 5.0.51b

              PHP 5.2.6

              PHP 4.4.8

              phpMyAdmin 2.11.7

              So, habe dei SQL Syntax getestet. Die funktioniert auch richtig.
              Nur irgendwie bekomme ich es nicht hin, dass ich eine ordentliche
              FALSE Meldung bekomme, wenn der Termin frei ist, bzw, wenn die Abfrage kein Ergebnis liefert.

              $query = "SELECT termin_id
                 FROM cisco_weekplan_termin
                 WHERE termin_tag = '".$form["tag"]."'
                 AND termin_raum = '".$session->get_user_raum()."'
                 AND (termin_kind = 1
                 OR termin_kind = 2)
                 AND '".$form["anf_std"]."'
                 BETWEEN termin_anf_std
                 AND termin_end_std
                 OR '".$form["end_std"]."'
                 BETWEEN termin_anf_std
                 AND termin_end_std";
              $dummy = sql_query($query);
              $check = mysql_fetch_array($dummy);

              if($check==FALSE){

              $insert = array('termin_fach'=> $session->get_user_fach(),
                 'termin_class'=> 0,
                 'termin_raum'=> $session->get_user_raum(),
                 'termin_anf_std'=> $form["anf_std"],
                 'termin_anf_min'=> $form["anf_min"],
                 'termin_end_std'=> $form["end_std"],
                 'termin_end_min'=> $form["end_min"],
                 'termin_tag'=> $form["tag"],
                 'termin_kind'=> $kind,
                 'termin_ver'=> 2
                         );
                $sql = make_sql_insert('cisco_weekplan_termin',$insert);
                sql_query($sql);

              $starthour=$form["anf_std"];
                $endhour=$form["end_std"];

              for($hour=$starthour;$hour<$endhour;$hour++){

              $del = "DELETE FROM cisco_weekplan_termin
                  WHERE termin_kind = '3'
                  AND termin_raum =
                                              '".$session->get_user_raum()."'
                  AND termin_tag = '".$form["tag"]."'
                  AND termin_anf_std = '".$starthour."'";
                sql_query($del);

              $starthour=$starthour+'01';
                      }

              return true;
                }else
                return -1;
              }

              Hatte noch einen Fehler bei der if abfrage, problem bleibt aber bestehen.

              1. das geht so nicht ... hättest du dir mysql_fetch_array() in der doku ein bisschen genauer durchgelesen wüsstest du, dass die funktion ein array mit den daten zurückliefert.

                Du muss hier mysql_num_rows() verwenden:
                $check = mysql_num_rows($dummy);
                ...
                if($check > 0) { //Kollision
                ...
                }
                else { //keine Kollision
                ...
                }

                1. das geht so nicht ... hättest du dir mysql_fetch_array() in der doku ein bisschen genauer durchgelesen wüsstest du, dass die funktion ein array mit den daten zurückliefert.

                  Du muss hier mysql_num_rows() verwenden:

                  @rauchi

                  Sicher?

                  Bei mir klappt "mysql_fetch_array()==FALSE", allerdings unter MySQL > 6.0

                  $check = mysql_num_rows($dummy);
                  ...
                  if($check > 0) { //Kollision
                  ...
                  }
                  else { //keine Kollision
                  ...
                  }

                  @Mathiis

                  Hatte noch einen Fehler bei der if abfrage, problem bleibt aber bestehen

                  Was war denn eigentlich "das Problem"?
                  Wie hat es sich geäussert?
                  Da ist kein Logging oder sowas im Code zusehen...

                  Desweiteren:

                  Du hast ja aber sicher schon in der MySQL Doku nachgeschaut dass

                  "Y BETWEEN X AND Z" bedeutet X <= Y <= Z, oder?

                  Ob Du das so ("<=" statt "<") auch willst, kannst Du nur selbst wissen; aber ich glaub's bei Deiner hiernach

                  'termin_end_std'=> $form["end_std"],
                     'termin_end_min'=> $form["end_min"],

                  zu vermutenden Zeitdarstellung mittels zweier Felder schon gar nicht.

                  Warum nimmst Du eigentlich nicht EIN Feld vom Typ DATETIME?

                  1. @rauchi

                    Sicher?

                    Nein, da hab ich scheinbar nicht gründlich genug gelesen "Liefert ein Array das dem aktuellen Datensatz entspricht oder FALSE, wenn keine weiteren Datensätze vorliegen."

                    Also muss der Fehler irgendwo anders liegen: mach mal print_r($check) und schau mal was da rauskommt.

                  2. @Mathiis

                    Hatte noch einen Fehler bei der if abfrage, problem bleibt aber bestehen

                    Was war denn eigentlich "das Problem"?
                    Wie hat es sich geäussert?
                    Da ist kein Logging oder sowas im Code zusehen...

                    Desweiteren:

                    Du hast ja aber sicher schon in der MySQL Doku nachgeschaut dass

                    "Y BETWEEN X AND Z" bedeutet X <= Y <= Z, oder?

                    Ob Du das so ("<=" statt "<") auch willst, kannst Du nur selbst wissen; aber ich glaub's bei Deiner hiernach

                    'termin_end_std'=> $form["end_std"],
                       'termin_end_min'=> $form["end_min"],

                    zu vermutenden Zeitdarstellung mittels zweier Felder schon gar nicht.

                    Warum nimmst Du eigentlich nicht EIN Feld vom Typ DATETIME?

                    Also, das Problem ist, dass ich den ganzen Code fertig bekommen habe. Das war eine Studienarbeit von Kommilitonen von mir. Ich soll diese Website nun um einige Funktionen erweitern und muss mich leider deren Stil anpassen.
                    Ich habe mich vorher noch nie mit PHP und MySQL oder auch Smarty beschäftigt und musste mich erst lange reinfuchsen, deswegen habe ich auch noch einige (große) Lücken, was mein Wissen angeht. Hätte ich alles von Grund auf selbst gemacht, hätte ich wahrscheinlich nicht so große Probleme. Ich habe also etliche Dateien mit ziemlich viel Code vorgesetzt bekommen.
                    Deswegen nehme ich die Tabellen, die schon vorhanden sind. Sonst müsste ich noch mehr im Code ändern.

                    Bis jetzt klappt der Check leider nicht, ob was in $check drin steht oder nicht. So wie ich das sehe müsste doch in $check nun 0 oder eine Zahl größer eins drin stehen oder?

        2. Entwicklungsumgebung ist übrigens XAMPP 1.67

          Ja schon, aber warum hast Du nicht diese Informationen

          • Plattform und MySQL-Version(Ganz wichtig!)
          • PHP Version und Einsatzart (mod_php, ISAPI, CGI)

          bereitgestellt?

          Füg bitte noch die CREATE-Anweisung für die Tabelle "cisco_weekplan_termin" hinzu.

          $query = "SELECT termin_id
             FROM cisco_weekplan_termin m
             WHERE termin_tag = '".$form["tag"]."'
             AND termin_raum = '".$session->get_user_raum()."'
             AND (termin_kind = 1
             OR termin_kind = 2)
             AND '".$form["anf_std"]."'
             BETWEEN m.termin_anf_std
             AND m.termin_end_std
             OR '".$form["end_std"]."'
             BETWEEN m.termin_anf_std
             AND m.termin_end_std";
          $dummy = sql_query($query);
          //$check = db_result($dummy);
          echo $dummy;

          Für sql_query() solltest Du angeben was es tut; dto. für db_result().
          Und mal überlegen ob's gut ist, dass letzteres auskommentiert ist, denn

          Das Ergebnis für dummy lautet: Resource id #27
          Diese ID ist jedoch nicht vergeben in meiner Tabelle...

          es scheint, dass Du gar kein DB-Feld ausgibst.

          Lass Dir dann bitte mal NUR die Ausdrücke $session->get_user_raum() und alles was mit $form[...] usw. zu tun hat anzeigen und bau Dir eine Query nur mit den erhaltenen Strings zusammen.

          Also alles was darin PHP-Code ist mal mit Werten ersetzen und die so erhaltene direkt im MySQL-(Web)Client ausführen lassen.