Mathis: Fehler in Schleife, nur wo?

Hallo, ich habe eine Function erstellt, die Termine für eine Woche aus einer Datenbank verarbeitet und mir dann eine Breite ausgibt. Diese Breite benötige ich für die Darstellung des Termins. Leider scheint es in meiner Schleife, wo ich die einzelnen Tage abrufe einen Fehler zu geben, denn ich bekomme nur die Termine des ersten Tages.

  
  
function termine_raum($firstday){  
  global $site_config, $session;  
  //Kalenderwerte  
  $min = 480;  
  $max = 1200;  
  $boardwidth=600;  
  $datewidth=60;  
  $calendarwidth=720;  
  //Ersten Tag der Woche konfigurieren  
  $date=$firstday[1]; //DD.MM.YYYY  
  $day=substr($date,0, 2); //DD  
  $month=substr($date,3, 2); //MM  
  $year=substr($date,6, 4);//YYYY  
  $date= $year.$month.$day; //YYYYMMDD  
  $diffdate=$date;  
  $dayadd=1;  
  
  for($i = 1; $i <= 6; $i++)  
  { //Schleife um Termine aus der Datenbank zu holen  
  $tmp[$i] = $this->get_day_termin_raum($diffdate); //aktueller Tag YYYYMMDD  
  
   $diffday=substr($diffdate,6, 2);  
   $diffmonth=substr($diffdate,4, 2);  
   $diffyear=substr($diffdate,0,4);  
   $utdiff=mktime(0, 0, 0, $diffmonth, $diffday+$dayadd, $diffyear); //Tag addieren  
   $date=date('Ymd',$utdiff);  
   $diffdate=$date;  
   echo $diffdate;  
  }  
  
  if(!empty($tmp)) {  
   foreach ($tmp as $key => $val) {  
    $summe = 0;  
    $y = 0;  
    $min = 480;  
    $width[$key]["tag"] = $this->wochentage[$key];  
    if(!empty($val)) {  
  
     foreach ($val as $k => $v) {  
  
      $starthour=$v["termin_startdate"];  
      $starthour=substr($starthour, 11, 2);  
      $startmin=$v["termin_startdate"];  
      $startmin=substr($startmin, 14, 2);  
      $endhour=$v["termin_enddate"];  
      $endhour=substr($endhour, 11, 2);  
      $endmin=$v["termin_enddate"];  
      $endmin=substr($endmin, 14, 2);  
  
      $width[$key]["daten"][$y]["width"] = (($starthour*$datewidth + $startmin) - $min)*($boardwidth/$calendarwidth);  
      $summe += $width[$key]["daten"][$y]["width"];  
      $width[$key]["daten"][$y]["class"] = "eintrag_lost";  
      $y++;  
      $width[$key]["daten"][$y]["width"] = (($endhour*$datewidth + $endmin) - ($starthour*$datewidth + $startmin))*($boardwidth/$calendarwidth);  
  
      $width[$key]["daten"][$y]["von"] = $starthour.":".$startmin;;  
      $width[$key]["daten"][$y]["studenten"] = $this->get_user_termin($v["termin_id"]);  
      $width[$key]["daten"][$y]["bis"] = $endhour.":".$endmin;  
      $width[$key]["daten"][$y]["termin_id"] = $v["termin_id"];  
      if($v["termin_kind"] == 3) {  
       $width[$key]["daten"][$y]["class"] = "eintrag_free";  
      }  
      elseif($v["termin_kind"] == 1){  
       $width[$key]["daten"][$y]["class"] = "eintrag";  
      }  
      else {  
       $width[$key]["daten"][$y]["class"] = "eintrag_sperr";  
      }  
  
      $summe += $width[$key]["daten"][$y]["width"];  
      $y++;  
  
      $min = $endhour*$datewidth + $endmin;  
     }  
    }  
    $width[$key]["daten"][$y]["width"] = $boardwidth - $summe;  
  
   }  
  }  
  
  return $width;

Weiß jemand Rat? Ich bin am verzweifeln. :-(

  1. Hallo, ich habe eine Function erstellt, die Termine für eine Woche aus einer Datenbank verarbeitet und mir dann eine Breite ausgibt. Diese Breite benötige ich für die Darstellung des Termins. Leider scheint es in meiner Schleife, wo ich die einzelnen Tage abrufe einen Fehler zu geben, denn ich bekomme nur die Termine des ersten Tages.

    [code lang=php]

    ...

    //Ersten Tag der Woche konfigurieren
      $date=$firstday[1]; //DD.MM.YYYY
      $day=substr($date,0, 2); //DD
      $month=substr($date,3, 2); //MM
      $year=substr($date,6, 4);//YYYY
      $date= $year.$month.$day; //YYYYMMDD
      $diffdate=$date;

    Es ist ratsam, dass man haarsträubende Schritte wie diese zuerst testet, bevor man auf das Resultat ein Reich baut.

    Bitte, es gibt wirklich klarere Methoden, freeform Daten zu zu konvertieren.

    in Perl schlicht:
    ( my $date = $firstday[1] ) =~ s/(\d\d).(\d\d).(\d\d\d\d)/$3$2$1/;

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. [code lang=php]
      ...
        //Ersten Tag der Woche konfigurieren
        $date=$firstday[1]; //DD.MM.YYYY
        $day=substr($date,0, 2); //DD
        $month=substr($date,3, 2); //MM
        $year=substr($date,6, 4);//YYYY
        $date= $year.$month.$day; //YYYYMMDD
        $diffdate=$date;

      Es ist ratsam, dass man haarsträubende Schritte wie diese zuerst testet, bevor man auf das Resultat ein Reich baut.

      Bitte, es gibt wirklich klarere Methoden, freeform Daten zu zu konvertieren.

      in Perl schlicht:
      ( my $date = $firstday[1] ) =~ s/(\d\d).(\d\d).(\d\d\d\d)/$3$2$1/;

      mfg Beat

      Hi, danke für deinen beitrag. Ich habe mich mit Perl leider noch nicht beschäftigt und das Datum wird mit diesen Aktionen eigentlich genauso zusammengebaut, wie ich es brauche, denn die Ausgabe des ersten Tages klappt ja.

      1. Hi,

        das Datum wird mit diesen Aktionen eigentlich genauso zusammengebaut, wie ich es brauche

        aber warum überhaupt? Ein kleiner Tipp hierzu: speichere das Datum in der Form, in der Du es zur Auswertung benötigst. Es ist viel ökonomischer, wenn es dann nur noch für die Anzeige formatiert werden muss.

        freundliche Grüße
        Ingo

        1. aber warum überhaupt? Ein kleiner Tipp hierzu: speichere das Datum in der Form, in der Du es zur Auswertung benötigst. Es ist viel ökonomischer, wenn es dann nur noch für die Anzeige formatiert werden muss.

          freundliche Grüße
          Ingo

          Das verstehe ich schon, nur leider habe ich es so übernommen und soll es weiterentwickeln. ich hole mir das Datum aus einer SQL Datenbank als Datetime.

          Mit dieser Schleife

            
          for($i = 1; $i <= 6; $i++)  
          //Schleife um Termine aus der Datenbank zu holen  
          $tmp[$i] = $this->get_day_termin_raum($diffdate); //aktueller Tag YYYYMMDD  
                  $diffday=substr($diffdate,6, 2); //DD  
                  $diffmonth=substr($diffdate,4, 2); //MM  
           $diffyear=substr($diffdate,0,4); //YYYY  
           $utdiff=mktime(0, 0, 0, $diffmonth, $diffday+$dayadd, $diffyear); //Tag addieren  
           $diffdate=date('Ymd',$utdiff);  
          }
          

          will ich aus der Funktion

            
          function get_day_termin_raum($date){  
            global $site_config, $session;  
            
            $starttime=$date.'000000';  
            $endtime=$date.'235959';  
            
            $query = "SELECT * FROM cisco_weekplan_termin WHERE termin_fach  = '".$session->get_user_fach()."'  
                        AND termin_startdate  
                        BETWEEN '".$starttime."'  
                        AND '".$endtime."'  
                        ORDER by termin_startdate";  
            $res = sql_query($query);  
            $termine = db_result($res);  
            
            return $termine;  
           }
          

          jeweils einen Tag in $tmp[$i] packen. Das klappt auch für den ersten Tag, leider nicht mehr für den zweiten und ich möchte einfach nur wissen, was an der Schleife verkehrt ist, denn da vermute ich meinen Fehler. Das es ökonomischere Wege gibt kann ich mir denken, nur bin ich nicht so der Superprogrammierer und muss mich mit dem zufrieden geben, was ich nun habe. Also weiß vielleicht jemand, wieso ich die anderen Termine nicht in das Array packen kann????? Hilfe... :'-(

          Viele Grüße

          Mathis

          1. Hi,

            Das verstehe ich schon, nur leider habe ich es so übernommen und soll es weiterentwickeln. ich hole mir das Datum aus einer SQL Datenbank als Datetime.

            wohl kaum im Format DD.MM.YYYY - daher mein Tipp, die Datenbank sinnvoll zu befüllen - eine einmalige Konvertiertung würde einiges leichter machen.

            und ich möchte einfach nur wissen, was an der Schleife verkehrt ist, denn da vermute ich meinen Fehler.

            der aber nichts mit meinem Tipp zu tun hat (und den ich auch noch nicht ausfindig gemacht habe).

            freundliche Grüße
            Ingo

            1. wohl kaum im Format DD.MM.YYYY - daher mein Tipp, die Datenbank sinnvoll zu befüllen - eine einmalige Konvertiertung würde einiges leichter machen.

              Hehe, also die Termine liegen im Format 2009-01-05 08:00:00 in der Datenbank. Als Datetime.

              Den ersten Tag der Woche und den aktuellen Tag hole ich mir über die Funktion:

                
              function instructor_dates() {  
                $date    = date(d);  
                $month   = date(m);  
                $year    = date(y);  
                $weekday = date(w);  
                
                if(date(w) == 0){  
                  $firstday=date('d.m.y', mktime(0, 0, 0, $month, $date-$weekday -6, $year));  
                   $lastday=date('d.m.y', mktime(0, 0, 0, $month, $date-$weekday , $year));  
                 }  
                else{  
                   $firstday=date('d.m.y', mktime(0, 0, 0, $month, $date-$weekday +1, $year));  
                   $lastday=date('d.m.y', mktime(0, 0, 0, $month, $date-$weekday +7, $year));  
                }  
                $today=date('d.m.y');  
                
               $dates=array($today, $firstday, $lastday);  
                
               return $dates;  
               }  
              
              

              Und das baue ich auf DD.MM.YYYY um, damit ich es ausgeben kann.
              An der Addition des einen Tage skann es meiner Meinung nach nicht liegen, denn das funktioniert soweit. Er schreibt es einfach nicht in den Array. :-(

              1. echo $begrüßung;

                Hehe, also die Termine liegen im Format 2009-01-05 08:00:00 in der Datenbank. Als Datetime.

                Wenn du ein für PHP brauchbares Format haben möchtest, dann lass dir den Unix-Timestamp davon geben (MySQL vorausgesetzt. Wenn nicht, weiterlesen, strtotime() verwenden).

                Den ersten Tag der Woche und den aktuellen Tag hole ich mir über die Funktion:

                Den kann man wunderbar mit MySQL ermitteln

                SELECT datum - INTERVAL WEEKDAY(datum) DAY

                WEEKDAY() ermittelt den Wochentag mit Montag als 0. Wenn man diese Angabe als Anzahl Tage vom gegebenen Datum abzieht, bekommt man den Montag:

                SELECT '2009-01-07' - INTERVAL WEEKDAY('2009-01-07') DAY

                ergibt 2009-01-05.

                Andere DBMS haben ebenfalls nicht zu unterschätzende Datumsberechnungsfunktionen.

                Aber auch mit PHP kann man sehr schön Datumsrechnen. Die Funktion strtotime() macht eine Menge Rechnungen im Klartext. Zum einen kann sie die Angabe im Format YYYY-MM-DD ohne weiteres in einen Unix-Timestamp umrechnen.

                Als erstes kann man fragen, ob das Datum ein Montag ist:

                date('N', strtotime($datum)) == 1

                Wenn dies nicht der Fall ist, muss er ermittelt werden:

                strtotime($datum . ' last monday');

                Das ergibt den Unix-Timestamp vom nächsten zurückliegenden Montag (0 Uhr Ortszeit).

                An der Addition des einen Tage skann es meiner Meinung nach nicht liegen, denn das funktioniert soweit. Er schreibt es einfach nicht in den Array. :-(

                Debugging! Fehler bei denen Wunsch und Wirklichkeit nicht miteinander übereinstimmen sucht man mit Kontrollausgaben. Mit Spekulieren und Annahmen kommt man meist nicht weiter. Für Kontrollausgaben eignet sich weniger gut ein einfaches echo, besser ist ein var_dump(), weil das genauere Informationen zur Variablen oder zum Ergebnis des übergebenen Ausdrucks liefert.

                echo "$verabschiedung $name";

                1. Debugging! Fehler bei denen Wunsch und Wirklichkeit nicht miteinander übereinstimmen sucht man mit Kontrollausgaben. Mit Spekulieren und Annahmen kommt man meist nicht weiter. Für Kontrollausgaben eignet sich weniger gut ein einfaches echo, besser ist ein var_dump(), weil das genauere Informationen zur Variablen oder zum Ergebnis des übergebenen Ausdrucks liefert.

                  echo "$verabschiedung $name";

                  Hallo und vielen Dank für deinen Beitrag.
                  Ich habe nun strtotime benutzt.

                    
                  for($i = 1; $i <= 6; $i++)  
                    { //Schleife um Termine aus der Datenbank zu holen  
                     $tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD  
                     $diffdate=strtotime($date);  
                     $date=strtotime("+1 day", $diffdate);  
                    }  
                  
                  

                  Leider bekomme ich immernoch keine Ausgabe von Terminen nach dem 1. Tag.
                  Das Problem mit der Fehlerquelle finden ist leider, dass ich hier ein Projekt bekommen habe, dass zum großen Teil schon entwickelt war. Das beeinhaltet auch leider die Templateengine Smarty, die eine Fehlerfindung für mich fast unmöglich macht, denn var_dump funktioniert nicht, bzw weiß ich nicht, wo ich es ansetzen muss.

                  Viele Grüße

                  Mathiis

                  1. echo $begrüßung;

                    Leider bekomme ich immernoch keine Ausgabe von Terminen nach dem 1. Tag.

                    Da hilft nur weitersuchen.

                    Das Problem mit der Fehlerquelle finden ist leider, dass ich hier ein Projekt bekommen habe, dass zum großen Teil schon entwickelt war. Das beeinhaltet auch leider die Templateengine Smarty, die eine Fehlerfindung für mich fast unmöglich macht, denn var_dump funktioniert nicht, bzw weiß ich nicht, wo ich es ansetzen muss.

                    Kontrolliere modular. Stimmt das Ergebnis der Berechnung? Ist der Wert immer noch der gleiche, wenn er weitergegeben wird (in dem Fall an Smarty)? Was heißt "funktioniert nicht" in deinem Fall?

                    echo "$verabschiedung $name";

                    1. echo $begrüßung;

                      Leider bekomme ich immernoch keine Ausgabe von Terminen nach dem 1. Tag.

                      Da hilft nur weitersuchen.

                      Das Problem mit der Fehlerquelle finden ist leider, dass ich hier ein Projekt bekommen habe, dass zum großen Teil schon entwickelt war. Das beeinhaltet auch leider die Templateengine Smarty, die eine Fehlerfindung für mich fast unmöglich macht, denn var_dump funktioniert nicht, bzw weiß ich nicht, wo ich es ansetzen muss.

                      Kontrolliere modular. Stimmt das Ergebnis der Berechnung? Ist der Wert immer noch der gleiche, wenn er weitergegeben wird (in dem Fall an Smarty)? Was heißt "funktioniert nicht" in deinem Fall?

                      echo "$verabschiedung $name";

                      Nun geht doch alles. :-)

                  2. for($i = 1; $i <= 6; $i++)
                      { //Schleife um Termine aus der Datenbank zu holen
                       $tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD
                       $diffdate=strtotime($date);
                       $date=strtotime("+1 day", $diffdate);
                      }

                      
                    Kommando zurück....  
                      
                    Ich hab debn Fehler gefunden, auch wenns mir nicht klar ist, dass ich ihn gefunden hab, aber es geht. Habe in der Schleife oben nur was vergessen...  
                      
                    ~~~php
                      
                    for($i = 1; $i <= 6; $i++)  
                      { //Schleife um Termine aus der Datenbank zu holen  
                       $tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD  
                       $diffdate=strtotime($date);  
                       $date=date("Ymd", strtotime("+1 day", $diffdate));  
                      }  
                    
                    

                    Vielen Dank schonmal für die Hilfe!!!!!!!

                    Viele Grüße Mathiis

                    1. Hi,

                      $tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD

                      wozu soll dise Zeile (noch) dienen?

                      freundliche Grüße
                      Ingo

                      1. Hi,

                        $tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD
                        wozu soll dise Zeile (noch) dienen?

                        freundliche Grüße
                        Ingo

                        Hallo,

                        diese Zeile holt über die Funktion get_day_termin_raum (ja, dieser Mischmasch aus Englisch und Deutsch ist peinlich!!!!!!) alle Termine eines Tages aus der Datenbank:

                          
                        function get_day_termin_raum($date){  
                          global $site_config, $session;  
                          
                          $starttime=$date.'000000';  
                          $endtime=$date.'235959';  
                          
                          $query = "SELECT * FROM cisco_weekplan_termin WHERE termin_fach  = '".$session->get_user_fach()."'  
                                      AND termin_startdate  
                                      BETWEEN '".$starttime."'  
                                      AND '".$endtime."'  
                                      ORDER by termin_startdate";  
                          $res = sql_query($query);  
                          $termine = db_result($res);  
                          
                          return $termine;  
                          
                         }