Zum Inhalt springen

While-Schleife wird nur einmal durchlaufen

Erstellt am 31. Dezember 2010 · 5 Antworten · letzte Antwort am 19. Januar 2011

Tags: Frage

ViktoriaS ·

Hallo!

Habe ein merkwürdiges Problem.
In einer Funktion habe ich zwei While-Schleifen und dieses werden beide immer nur einmal durchlaufen.
Muss ja ein voll blöder Syntax-Fehler sein. Doch ich sehe ihn nicht. #angry#
Wärt Ihr so nett und würdet einmal schauen!?

$tmpl = $this->cObj->fileResource("typo3conf/ext/coursemanager/tmpl_coursemanager_main.html" ) ;
$subpart = $this->cObj->getSubpart($tmpl, "###CALC_STATUS###" ) ;
$subsub  = $this->cObj->getSubpart($subpart, "###CALC_MESSAGE###" ) ;
// Alle Felder part_act in Tabelle courses auf Null setzen
$updateArray = array('part_act' => 0, 'part_free' => 14 ) ;
$res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery($tablec, $where, $updateArray) ;

// Aus allen Datensätzen der Tabelle bookings Kurs-ID auslesen und in Tabelle Course part_act um 1 erhöhen
// Und die Gebühr aus der Tabelle course in bookings übernehmen
$where = 'deleted = 0 and hidden = 0';
$res = $GLOBALS["TYPO3_DB"]->exec_SELECTquery("*", $tableb, $where, '', '' ) ;
  if (mysql_error())  debug(array(mysql_error(), $query)) ;
  while ($row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res)) 
    { 
    $paid  = $row[paid] ;  
    $cuid  = $row[course_id];
    
    // Auslesen Satz aus Kurstabelle und Updaten Anzahl Buchungen
    $rowc = $this->pi_getRecord($tablec, $cuid );
    $costs    = $rowc[costs];
    $open     = $costs - $paid ;
    $part_new = $rowc[part_act] + 1 ;
    $updateArray = array('part_act' => $part_new );
    $where = "uid = $cuid" ; 
    $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery($tablec, $where, $updateArray) ;

// In Tabelle Booking Updaten Cost und zu Zahlen
  $updateArray = array('to_pay' => $costs, 'open' => $open) ;
  $where = "course_id = $cuid" ;
  $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery($tableb, $where, $updateArray);
    echo("  UPDATE Kursgebuehr: ".$where . ".  " );
    } // Ende Verbuchen 
 
  // Anhand des Wertes part_act in der Tabelle courses die Felder part_free, status und clip neu setzen 
  $where = 'deleted = 0 and hidden = 0';
  $res = $GLOBALS["TYPO3_DB"]->exec_SELECTquery("*", $tablec, $where, '', '' ) ;
  if (mysql_error())  debug(array(mysql_error(), $query)) ;
  while ($row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res))
    {
    $course_id = $row[uid];
    $where = "uid = $course_id" ;
    $part_free = $row[part_max] - $row[part_act] ;
    if      ($part_free == 0) { $img_status = 'BStatus3.gif'; $txt_status = 'ausgebucht';}
    else if ($part_free < 6)  { $img_status = 'BStatus2.gif'; $txt_status = 'kann starten';}
    else                      { $img_status = 'BStatus1.gif'; $txt_status = 'noch zu wenig';}
    $updateArray = array('part_free' => $part_free, 'clip' => $img_status, 'status' => $txt_status) ;
    $res = $GLOBALS['TYPO3_DB']->exec_UPDATEquery($tablec, $where, $updateArray);
    echo ("  UPDATE in Tabelle Courses!" ) ;
    }

Ich weiß, es ist ein gigantischer Wust.
Vielleicht hilft ja ein klein wenig Erläuterung:
Hier werden abwechselnd 2 Tabellen bearbeitet: Buchungen und Kurse
In der Tabelle Kurse wird für jeden Kurs der Anmeldestand mit Null vorbelegt
Für jede Buchung wird in der Tabelle Kurse der Anmeldestand um 1 erhöht.
Dabei wird aus der Tabelle Kurse die Kursgebühr in den Buchungssatz übernommen und
im Buchungssatz die Restgebühr neu berechnet
Nach Durchführung der Buchungen werden in der Tabelle Kurse die Felder
part_free, status und clip neu gefüllt.

Vielen Dank im Voraus
Viki

Julian.​Hofmann ·

Hallo Viki.

ViktoriaS schrieb

Ich weiß, es ist ein gigantischer Wust.

Da dürfte auch das Problem (zumindest mit) herkommen. Deine erste WHILE-Schleife greift auf $res zurück. Während ihrer Schleife wird eine neue Anfrage and ie DB gesendet und wieder als $res gespeichert => Deine erste Resource ist überschrieben...

Viele Grüße
Julian

P.S: Schau Dir statt "$where = 'deleted = 0 and hidden = 0';" mal tslib_cObj::enableFields() an.

ViktoriaS ·

Hallo Julian

Danke für die Hilfe.
Nach Umbenennung von 3x "res" klappt es nun.

Der Linkhinweis mag ja nett gemeint zu sein, doch ich verstehe ihn leider nicht.
Hast Du vielleicht auch ein Beispiel dazu, so wie man es von Self-HTML kennt????

Viele Grüße

Viki

Julian.​Hofmann ·
$fromTable = 'tt_content';
$groupBy = '';
$orderBy = '';
$limit = '';
$select_fields = $fromTable . '.*';
$where = $fromTable . '.uid=123' . 
$where .= $this->cObj->enableFields($fromTable);

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields, $fromTable, $where, $groupBy, $orderBy, $limit);

Da sollte dann letztlich als Query rauskommen:

SELECT tt_content.* 
FROM tt_content 
WHERE uid=123
AND deleted=0 AND hidden=0 AND (starttime=0 OR startime<[aktueller_timestamp]) AND (endtime=0 OR endtime>[aktueller_timestamp]) AND (fe_group=0 OR fe_group=...)
ViktoriaS ·

Hay Julian!

Danke vielmals für den Link und die ausführliche Erläuterung.

Ist nun sehr verständlich.
Bis ich auch nun annähernd durch die Doku durchsteige wird es aber wohl noch etwas dauern. #paralyzed#

Viele Grüße

Viki

Julian.​Hofmann ·
ViktoriaS schrieb

Bis ich auch nun annähernd durch die Doku durchsteige wird es aber wohl noch etwas dauern. #paralyzed#

Kann ich nachvollziehen. Geht glaub ich anfangs jedem so #paralyzed#
Wenn Du viel mit TYPO3 machen willst/musst, empfehle ich Dir immer etwas Zeit einzuplanen und aufzuwenden, um Dich ein Stück weiter reinzulesen und stets in Dokumentation usw. bisschen vor/nach Deinem eigentlichen Problem auch zu lesen. So entdecke ich immer wieder interessantes und der Überblick wird immer besser...

Zum schnellen Nachschlagen, wie einzelne Funktionen definiert sind:
http://www.typo3-unleashed.net/typo3apidocs/latest/

Viel Spaß weiterhin mit TYPO3