Problem mit verschachtelten Schleifen
Daniel
- php
0 Daniel0 Julian Hofmann0 Daniel
0 AlexBausW0 Daniel
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
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;
?>
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
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
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
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