Fehler in Schleife, nur wo?
Mathis
- php
0 Beat0 Mathiis0 Ingo Turski0 Mathiis
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. :-(
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
[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.
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
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
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
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. :-(
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";
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
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";
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. :-)
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
Hi,
$tmp[$i] = $this->get_day_termin_raum($date); //aktueller Tag YYYYMMDD
wozu soll dise Zeile (noch) dienen?
freundliche Grüße
Ingo
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;
}