Problem mit Schleife, denkanstoß :-)

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

  • Problem mit Schleife, denkanstoß :-)

    Hallo zusammen,

    ich erstelle gerade ein Terminverplanungstool mit PHP.
    Ich erstelle eine Tabelle wo links die Namen stehen sollen und nach recht die Zeiten und wo die Namen ein Termin haben oder nicht.

    Jetzt ist es so das mein Tool die Namen und die Termine einträgt aber hinter den Terminen manchmal die Zeit nicht mehr stimmt und deshalb die folgenden Termine nicht stimmen.

    Der Termin wird in einer Datenbank gespeichert und das Datum/Zeit als Timestamp.

    Ich geb euch mal das Script:

    PHP-Code:
    $zeit_array = array(":00",":15",":30",":45");

    <table class="table_main" cellpadding="1" cellspacing="1">
     <tr>
     <td class="table_oben">Techniker</td>
     <?php
            
    for($begin_start 8$begin_start<=18$begin_start++) // Schleife für die Stunden
            
    {
             for(
    $count_zeit 0$count_zeit<=3$count_zeit++) // Schleife für die Minuten
             
    {
             
    $zeit_temp $begin_start.$zeit_array[$count_zeit];
             echo 
    '<td class="table_oben"><b>'.$zeit_temp.'</b></td>';
             if(
    $begin_start == 18){break;}
             }
            }
    $temp "0";
    ?>

    </tr>
    <?php
    $techniker 
    "SELECT * FROM ta_users";
    $techniker_ergebnis mysql_query($techniker);
    while(
    $techniker_daten mysql_fetch_object($techniker_ergebnis)) // +++ AUSGABE VON TERMIN
    {
    $temp_var "0";
    echo 
    '<tr>';
    echo 
    '<td>'.$techniker_daten->vorname.'&nbsp;'.$techniker_daten->name.'</td>';

     for(
    $table_start 8$table_start<=18$table_start++) // Schleife für die Stunden
     
    {
      for(
    $count_zeit 0$count_zeit<=3$count_zeit++) // Schleife für die Minuten
      
    {
      
    $table_temp $table_start.$zeit_array[$count_zeit]; //Zeit zusammenbauen
      
    $termin_zeit_temp strtotime($jahr."-".$monat."-".$tag." ".$table_temp);// Generieren TIMESTAMP
      
    $start_termin strtotime($jahr."-".$monat."-".$tag." 00:00");// Generieren TIMESTAMP

      
    $termine "SELECT * FROM ta_termine WHERE id_technik = '$techniker_daten->id' AND start_datum = '$termin_zeit_temp' ORDER BY start_datum";
      
    $termine_ergebnis mysql_query($termine);
      if(
    mysql_num_rows($termine_ergebnis) == 0// ++++ WENN KEIN TERMIN VORHANDEN
      
    {
      echo 
    "<td onmouseover=\"style.border='2px solid #9A1C8E'\" 
    onmouseout=\"style.border='1px solid #D5DCF5'\" class=\"table_unten_leer\">
    <div onclick=\"window.location='ta_eintrag_termin.php?termin="
    .$termin_zeit_temp."&technik=".$techniker_daten->id."'\" 
    onmouseover=\"style.color='#C619A6'\" 
    onmouseout=\"style.color='#EFF0FA'\">"
    .$table_temp."</div></td>";
      
    //echo '<td class="table_unten" >frei</td>';
      
    }
      else
      {
       
    $termine_daten mysql_fetch_object($termine_ergebnis);
         if (
    $termin_zeit_temp >= $termine_daten->start_datum && $termin_zeit_temp $termine_daten->end_datum)
         {
          
    $temp_var = (($termine_daten->end_datum $termine_daten->start_datum)/60/15);
          echo 
    '<td class="table_unten" colspan="'.$temp_var.'">
    <b><font color="#FF0000" >'
    .date("H:i"$termine_daten->start_datum).'&nbsp;-&nbsp;'.date("H:i"$termine_daten->end_datum).'</font></b></td>';
          
    $count_zeit $count_zeit+$temp_var;
         }
         else
         {
         
    $temp_var "0";
         echo 
    "<td onmouseover=\"style.border='2px solid #9A1C8E'\" onmouseout=\"style.border='1px solid #D5DCF5'\" class=\"table_unten_leer\">
    <div onclick=\"window.location='ta_eintrag_termin.php?termin="
    .$termin_zeit_temp."&technik=".$techniker_daten->id."'\" onmouseover=\"style.color='#C619A6'\" 
    onmouseout=\"style.color='#EFF0FA'\">+</div></td>"
    ;
         }
      }
      if(
    $table_start == 18){break;}
      }
    //Ende FOR Minuten
     
    }//Ende FOR Stunden

    echo '</tr>';
    }

    ?>

    </table>
    Und so sieht es aus:

    Im ersten Screen sieht man den Anfang der geht


    Aber dann danach wo auch immer der Termin eingetragen wird sieht man das die Zeit danach nach dem Termin nicht mehr analog stimmt.


    Ich hoffe ich konnte gut erklären was ich mein.
    Eventuell liegt irgendwo ein Denkfehler an meinem Script.

    Irgendwie muss ich sauber die Zeit überbrücken was ich als "colspan" für die Tabelle als Termin nutzen will. Aber das Script muss sauber weiterlaufen.

    Mit: $temp_var = (($termine_daten->end_datum - $termine_daten->start_datum)/60/15);

    errechne ich die Anzahl der Viertelstunden zwischen start und ende und trage das als Colspan ein. Funktioniert ja auch aber naja...nicht immer.

    Könnt ihr mir helfen?

    Danke!


    Gruß, Picard

  • #2
    Hallo,

    du hast ja zwei Screen Snapshots dazugepackt. Kannst du bitte nochmal erklären, was an dem zweiten nicht stimmt? Für mich sieht das richtig aus.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Gerne, also du siehst ja zwischen den Terminen das da frei ist.
      Und als überprüfung habe ich statt eine leere Spalte die Zeit reinschreiben lassen damit ich sehen kann ob die schleife sauber weiterläuft.

      Jetzt siehst du bei dem 2. Screen das nach dem Termin die Zeit um 15 min. zurück hängt. Ist schlecht zu erkennen weil ich grau als Farbe habe. Die Zahlen dazwischen dienen ja auch nur zur überprüfung.

      Im 2. Screen müsste er also nach dem Termin auch bei 14:15 Uhr weitergehen und nicht bei 14:00 anfangen. Somit verschiebt sich alles nach hinten.

      Ich denke es liegt hier dran:
      $count_zeit = $count_zeit+$temp_var;

      Hier addiere ich die Berechnung der Anzahl der Viertelstunden vom Termin und addiere sie auf die SChleife damit sie nach dem Termin weiterläuft wo der Termin endet. Ich denke hier verschluckt er sich irgendwo.

      Ich hoffe ich konnte es gut erklären :-(

      Kommentar


      • #4
        Achso, ich hab erst gar nicht gesehen, dass da noch Uhrzeiten drin stehen. Du musst $count_zeit nach dem Addieren mit $temp_var durch 4 dividieren, den Integer-Teil zu $table_start addieren und den Rest (Modulo) als neue $count_zeit setzen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          What? Danke für deine Antwort...aber so richtig habe ich das nicht verstanden.

          Warum durch 4?

          Kannst du mir das kurz genauer erklären bzw. anhand des scriptes irgendwie oder mir zeigen mit ein paar scriptzeilen wie du das meinst?

          DANKE!

          Kommentar


          • #6
            Also, deine $temp_var ist die Anzahl an Viertelstunden seit der Termin begonnen hat, z. B. 5 bei dem zweiten Screen. Der Stundenzähler ($table_start) steht auf 13, der Viertelstundenzähler ($count_zeit) steht auf 0, weil der Termin 13:00 angefangen hat. Wenn du jetzt nur die 5 zu der 0 rechnest, hast du $table_start immer noch auf 13. Jetzt wird aber noch die innere Schleife fortgesetzt, also $count_zeit++ (6) und erneut die Schleifenbedingung geprüft ($count_zeit <= 3), die wegen des Überlaufs in die nächste Stunde nicht erfüllt wird. Daher geht die Kontrolle wieder in die äußere Schleife und die erhöht den Stundenzähler (14) und setzt den Viertelstundenzähler wieder auf 0, dadurch kommt 14:00 raus und nicht 14:15.

            Wenn du den Überlauf von $count_zeit nach der Addition abfängst, indem du ihn in ganze Stunden (floor($count_zeit / 4)) und Viertelstunden ($count_zeit % 4) zerlegst und das dem jeweiligen Schleifenzähler hinzuaddierst, kommt das richtige raus.

            PHP-Code:
            $count_zeit $count_zeit+$temp_var;
            $table_start += floor($count_zeit 4);
            $count_zeit %= 4
            Zuletzt geändert von AmicaNoctis; 21.10.2009, 09:12.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Supi, dank dir jedoch gibt es noch probleme.
              Schau mal auf den Screen:



              Ich denke es liegt wahrscheinlich am Array wenn ich das mit deiner Lösung durchführe:

              $zeit_array = array(":00",":15",":30",":45");

              Hast du noch eine Idee?

              Kommentar


              • #8
                Achso, ja. Ich hab das Schleifeninkrement nicht kompensiert. Also noch ein Versuch:
                PHP-Code:
                $count_zeit += $temp_var 1;
                $table_start += floor($count_zeit 4);
                $count_zeit %= 4
                Haut's jetzt hin? Ich hab es selber nicht getestet.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Ahhh ja jetzt versteh ich, man oh man...da denkt man sich so viel aus und trotzdem liegt es an 3 Zeilen.

                  ICH DANKE DIR...sieht gut aus. Jedenfalls habe ich jetzt ne menge Testtermine eingestellt und sind in Moment noch alle richtig drin :-)

                  DANKE!!!

                  Super Forum....!!!


                  Gruß, Picard

                  Kommentar

                  Lädt...
                  X