Daniel: Problem mit verschachtelten Schleifen

Hallo zusammen

Ich habe die folgenden Schleifen in meinem Script und es funktioniert einfach nicht. Kann es sein, dass die While-Schleife nur einmal ausgeführt wird? Das verrückte ist, dass wenn
ich die Query-Anfrage nochmals mache, das ganze funtioniert! (Als ob die While-Schleife bei einer Veränderung nochmals abgefragt wird...) Ich hoffe es kann mir jemand helfen, habe gestern den ganzen Abend an diesem Problem vertrödelt...

################################################################

foreach($columns as $temp)  {    //Spaltenköpfe werden durchlaufen

while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {                   //Abfrage des Spaltenkopf-Typs
       if ($row['name']==$temp) {
                   $type = $row['type'];
       }
  }

// WENN ICH HIER  $result2 = @mysql_query($sqlquery2, $conn);
// EINFÜGE, SO FUNKTIONIERT DAS SCRIPT!

if ($type=="path") {
          $value  = implode("",(@file($pathTemplates.$result[$temp])));
          $temp   = "{".$temp."}";
          $layout = ereg_replace($temp,$value,$layout);
      }

if ($type=="text") {
          $value  = ($result[$temp]);
          $temp   = "{".$temp."}";
          $layout = ereg_replace($temp,$value,$layout);
     }

if ($type=="datafield") {
          $value  = ($result[$temp]);
          $temp   = "{".$temp."}";
          $layout = ereg_replace($temp,$value,$layout);
     }
   }

echo $layout;

?>

################################################################

Gruss Daniel

  1. Der ganze Quelltext:

    <?php

    include("class/cmsConfig.inc.php");     //Laden der Config-Datei
    include("class/mysqlConnect.inc.php");  //Laden der Connect-Klasse

    #########################################################################
    //Prüft ob die Variabeln gesetzt wurden, dh. ob die Seite das erste Mal gestartet wurde

    if  (!isset($id)) {
    $id = $defaultId;
       }

    if  (!isset($table)) {
    $table=$defaultTable;
       }

    #########################################################################

    $obj1 = new MySQL_Connect;
    $conn = $obj1->Connect();

    $sqlquery="SELECT * FROM $table WHERE id=$id";

    $result = @mysql_query($sqlquery , $conn);
        if (!$result) {
            die("MySQL-Query konnte nicht ausgeführt werden.<BR><BR>Error: ".mysql_error());
        }
    //Zusammenfügen der Spaltenköpfe in den Array $strings

    settype($columns,"array");

    while($field = mysql_fetch_field($result))  {
       $columns = array_merge($columns,$field->name);
    }

    $result = mysql_fetch_array($result, MYSQL_ASSOC);

    $layout = implode("",(@file("$pathTemplates$result[layout]")));

    #########################################################################
    //Auslesen und ersetzen der Spalteneigenschaften
    $sqlquery2="SELECT * FROM $tableCMSData";
      $result2 = @mysql_query($sqlquery2, $conn);
          if (!$result2) {
            die("MySQL-Query 2 konnte nicht ausgeführt werden.<BR><BR>Error: ".mysql_error());
          }
    #########################################################################

    foreach($columns as $temp) {

    while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
        if ($row['name']==$temp){
          $type = $row['type'];
      }
      }

    $result2 = @mysql_query($sqlquery2, $conn);

    if ($type=="path") {
              $value  = implode("",(@file($pathTemplates.$result[$temp])));
              $temp   = "{".$temp."}";
              $layout = ereg_replace($temp,$value,$layout);
          }

    if ($type=="text") {
              $value  = ($result[$temp]);
              $temp   = "{".$temp."}";
              $layout = ereg_replace($temp,$value,$layout);
         }

    if ($type=="datafield") {
              $value  = ($result[$temp]);
              $temp   = "{".$temp."}";
              $layout = ereg_replace($temp,$value,$layout);
         }
       }

    echo $layout;

    ?>

    1. Hallo

      Was soll das Skript eigentlich tun? Habe es jetzt mal so grob überflogen und meine, dass Dein Problem nicht unbedingt in der Schleife liegt, sondern eher am Gesamtkonzept.

      Grüße aus Würzburg
      Julian

      1. Das Script ist Teil eines CMS. Aus einer Tabelle "Inhalt" werden die Spaltenköpfe ausgelesen. Danach werden die Eigenschaften dieser Spaltenköpfe aus einer anderen Tabelle "Eigenschaften" geholt. Letztendlich ersetzt das Script in einem Layout die {Klammern} (welche gleich heissen wie die Spaltenköpfe) durch die entsprechenden Feldwerte aus Tabelle "Inhalt" unter Berücksichtigung der Eigenschaften aus Tabelle "Eigenschaften" (Bsp: wenn in der Spalte Pfadangaben sind, so wird eine Datei imploded. Bei der Eigenschaft Text wird der Wert direkt aus der Datenbank gelesen...usw)

        Tabelle Inhalt ($table):

        id seitenname     feld1                titel1
        1  kontakt.htm    "/tpl/kontakt.htm"   "dies ist der Titel"

        Tabelle Eigenschaften ($tableCMSData):

        id feldname     type
        1  feld1        pfad
        2  titel1       titel1

        Vielleicht kann mir ja jetzt jemand helfen.

        Hallo

        Was soll das Skript eigentlich tun? Habe es jetzt mal so grob überflogen und meine, dass Dein Problem nicht unbedingt in der Schleife liegt, sondern eher am Gesamtkonzept.

        Grüße aus Würzburg
        Julian

  2. Hallo,

    [2x mysql_query() lässt Skript erst funktionieren]

    foreach($columns as $temp)  {    //Spaltenköpfe werden durchlaufen

    while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {                   //Abfrage des Spaltenkopf-Typs
           if ($row['name']==$temp) {
                       $type = $row['type'];
           }
      }

    Mit dieser while-Schleife durchläufst Du die gesamte Ergebnistabelle bis zu deren letzen Datensatz. Danach kann mysql_fetch_array() nicht mehr aus der Ergebnistabelle lesen.

    // WENN ICH HIER  $result2 = @mysql_query($sqlquery2, $conn);
    // EINFÜGE, SO FUNKTIONIERT DAS SCRIPT!

    [...]

    Das ist logisch, weil Du hier wieder eine neue Ergebnistabelle erzeugst, die von der obigen while-Schleife mit mysql_fetch_array() wieder abgefragt werden kann.

    Du solltest vielleicht die Schleifen genau umgekehrt schachteln. Die while-Schleife außen, und die foreach-Schleife darinnen (beispielhaft):

    while ([datensatz = getdatensatz]) {
     foreach ([wert]) {
      if ([datensatz_spalte == wert]) {
       [datensatzbearbeitung]
      }
     }
    }

    Über weitere Verbesserungen des Codes habe ich mir noch keine Gedanken gemacht. :)

    Gruß Alex

    1. Hallo,

      [2x mysql_query() lässt Skript erst funktionieren]

      foreach($columns as $temp)  {    //Spaltenköpfe werden durchlaufen

      while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {                   //Abfrage des Spaltenkopf-Typs
             if ($row['name']==$temp) {
                         $type = $row['type'];
             }
        }

      Mit dieser while-Schleife durchläufst Du die gesamte Ergebnistabelle bis zu deren letzen Datensatz. Danach kann mysql_fetch_array() nicht mehr aus der Ergebnistabelle lesen.

      // WENN ICH HIER  $result2 = @mysql_query($sqlquery2, $conn);
      // EINFÜGE, SO FUNKTIONIERT DAS SCRIPT!

      [...]

      Das ist logisch, weil Du hier wieder eine neue Ergebnistabelle erzeugst, die von der obigen while-Schleife mit mysql_fetch_array() wieder abgefragt werden kann.

      Du solltest vielleicht die Schleifen genau umgekehrt schachteln. Die while-Schleife außen, und die foreach-Schleife darinnen (beispielhaft):

      while ([datensatz = getdatensatz]) {
       foreach ([wert]) {
        if ([datensatz_spalte == wert]) {
         [datensatzbearbeitung]
        }
       }
      }

      Über weitere Verbesserungen des Codes habe ich mir noch keine Gedanken gemacht. :)

      Danke für die Antwort, werde das mal versuchen...

      Das heisst also...man könnte am Script noch vieles verbessern...?:-)

      Gruß Alex

      Gruss Daniel