Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines schleifenproblem mit unset
BlackPixel 23-01-2003, 12:34 Hallo Leute, Hallo Abraxax :D
Ich hab ein Problem. Zur Eläuterung: Ich habe ein Sript, einen Downloadmanager. Die Startseite Zeigt die Hauptkategorien an. die 2 Ebene besteht aus Subkategorien. Zusammengesetzt ist das ganze Teil mit Templates.
Hier mal der Code:
$result = $db_sql->sql_query("SELECT * FROM $cat_table WHERE subcat='0'");
while($cat = mysql_fetch_array($result)) {
eval ("\$cat_mainbit .= \"".gettemplate("cat_mainbit")."\";");
$subcat_show = $db_sql->sql_query("SELECT titel, catid FROM $cat_table WHERE subcat='$cat[catid]' LIMIT 3");
while ($cat_show = mysql_fetch_array($subcat_show)) {
unset($cat_link);
$cat_link = $cat_show['titel'];
eval ("\$cat_showbit .= \"".gettemplate("cat_showbit")."\";");
}
}
Also, die erste schleife holt die Hauptkategorien. Folgendes sollte passieren: Die erste hauptkategorie wird geholt, danach werden die Subkategorien geholt, LIMIT 3. Das Template für die Subkategorien ist im Template der Hauptkategorien eingebunden. Die Abfrage der Subkategorie läuft also 3 mal Durch, erstellt 3 Templates und zeigt diese im 1. Template der Hauptkategorie wieder an. Soweit so gut, das geht.
Nun habe ich aber folgendes Problem, beim 2. Komplett Durchlauf der Schleife werden anstatt die 3 neuen Subkat Templates zuerst die alten 3 und dann die neuen 3 angezeigt. Also ist meine Variable $cat_link noch mit meiner vorherehenden SQL Abfrage gefüllt. Das Unset sollte dies aber verhindern. Hat jemand nen Plan wie ich das geschickt lösen könnte?
Grüsse Manfred
mache vor die zeile mit
$subcat_show = $db_sql->sql
ein
reset($subcat_show);
rein. das müsste das problem schon lösen.
BlackPixel 23-01-2003, 13:41 Warning: Variable passed to reset() is not an array or object in C:\wampp2c\htdocs\ha\index.php on line 285
285 ist die Zeile mit reset..... ?!?!?!?
grosse leere macht sich in mir breit :dontknow:
Grüsse Manfred
ups. kommando zurück.... aber schnell... :) bin wohl nicht ganz wach heute.
so muss/müsste es aber passen....
.
.
.
reset($cat_show);
while ($cat_show = mysql_fetch_array($subcat_show)) {
.
.
.
kann sein, dass da noch ein fehler kommt. dann mache das reset NACH der while schleife rein.
.
.
.
while ($cat_show = mysql_fetch_array($subcat_show)) {
.
.
.
}
reset($cat_show);
.
.
.
BlackPixel 23-01-2003, 13:45 Ähm, nein, sorry, das gleiche nur at Line 287... :dontknow:
?!?
Grüsse Manfred
BlackPixel 23-01-2003, 13:49 Nö, auch nein.... bekomme den Fehler immer wieder?
.......
mhm. musst du mal weiter testen. ich hatte das auch schon. man muss nur so ein array wieder reseten. welches genau das bei dir ist, musst du mal schauen.
BlackPixel 23-01-2003, 13:56 Hab nun sämtliche variablen und array´s durch. bekomme immer wieder den fehler, und an der ausgabe hat sich auch nichts geändert :(
Güsse Manfred
wenn das jetz nicht geht, bin ich momentan ratlos. :(
$result = $db_sql->sql_query("SELECT * FROM ".$cat_table." WHERE subcat='0'");
while($cat = mysql_fetch_array($result)) {
eval ("\$cat_mainbit .= \"".gettemplate("cat_mainbit")."\";");
$subcat_show = $db_sql->sql_query("SELECT titel, catid FROM ".$cat_table." WHERE subcat='".$cat[catid]."' LIMIT 3");
while ($cat_show = mysql_fetch_array($subcat_show)) {
$cat_link = $cat_show['titel'];
eval ("\$cat_showbit .= \"".gettemplate("cat_showbit")."\";");
}
reset ($cat_show);
}
@Abraxax: Was soll denn das "reset" machen?
der setzt das array zurück.
Reset setzt doch den internen Array Pointer auf das erste Element des Arrays zurück. Steh ich jetzt total auf dem Schlauch?! Warum soll der Zeiger denn nun auf das erste Element zeigen, wenn $cat_show sowieso neu gefüttert wird?
ich weiss schon , dass der das nur auf den 1. entry setzt. ich hatte das problem irgendwo auch mal so gehabt. und mit reset() konnte ich es lösen. daher diese variante.
BlackPixel 24-01-2003, 15:57 Also, ne, so net. Das geht nicht. Egal ich welches array nehme, egal an welche stelle, ich bekomm immer diese fehlermeldung zurück. Dass kann doch net sein? Das muss doch gehn?
hmpfl
ich bin mit meinem latain im moment am ende .... :( sorry.
BlackPixel 24-01-2003, 16:24 Yo, naja, kann man nix machen *schnief* :D
Grüsse Manfred
aber noch ein kleiner tipp.
fange noch mal (fast) neu an.
überdenke dir erst einmal wie genau was passieren soll. dann machst du die äußere schleife .... wenn die sauber funktioniert, machst du die innere schleife..... ok?
hoffe, der tipp war zumindest ein schritt der lösung entgegen .... :)
BlackPixel 24-01-2003, 18:37 Yo, das mache ich schon seit gestern nacht :D Das Prinzip ist ja tierisch einfach!
Die äussere Schleife lädt die Hauptkategorien. Je nach menge der Hauptkategorien werden Templates dafür erstellt. Sind 6 Hauptkategorien vorhanden, läuft die Schleife 6 mal Durch und gibt mir 6 templates untereinander mit den Hauptkategorien raus. Das läuft erste Sahne.
Nun kommt die unterschleife. Die Äussere Schleife fängt an zu laufen, holt sich die erste Hauptkategorie. Dann wird das erste Template erstellt. Jetzt fängt die 2. schleife an. Diese holt sich anhand vom argument WHERE subcat = catid die Subkategorien. In der jetzigen schleife hat die catid den wert 0. Also werden alle Subkats mit subcat=0 geladen. angenommen es sind 5 Subcats in dieser Hauptkategorie enthalten, dann läuft die 2. schleife 6 mal durch und erstellt mir im Template für die Hauptkategorie 6 Templates mit dem Namen der Subcats. Ist diese 2. schleife durch fängt die 1. also die aüssere wieder an zu rattern, hier müsste jetzt die alte variable ja gelöscht werden, bzw das Ergebniss array der 2. schleife, was nicht geht, und holt mir die Hauptkategorie mit der catid=1. Dann wieder die 2. schleife. Argument: where subcat =catid, in diesem falle 1.
Der Ablauf ist logisch wie sonst nichts, oder? Warum behält die variable in der 2. Gesamtschleife dann den wert vom 1. Durchgang? Und im 3 Durchgang sind die variablen vom 1. und 2. Durchgang enthalten.... Trotz unset und reset.....
Das wird ne lange nacht :D
Grüsse Manfred
ok verstehe.
ich nehme mal an , dass die navigation in einer tabelle steht.
die steuerung welche id wozu gehört, wird über catid und subcat gesteuert. richtig.
ich habe sowas auch gemacht. jedoch verwende ich eine recursive funktion für das abbilden der navigation.
vielleicht hilft dir das weiter. die recursive fkt ist die dritte. diese ruft sich bei bedarf selber auf.
/* ************************************************************************************* */
function GetSubPageFromId ($PageId, $admin) {
if ($admin != "1") { $admin_where = " AND HTMLContent IS NOT NULL"; }
$result = mysql_query( "SELECT * FROM AllPages WHERE UpperId = '$PageId' $admin_where ORDER BY Sort,UpperId" );
if ( mysql_num_rows($result) > 0 ) {
while ($zeile=mysql_fetch_array($result)) {
$PageArray[$zeile["Id"]] = array (
"Id" => $zeile["Id"],
"UpperId" => $zeile["UpperId"],
"Sort" => $zeile["Sort"],
"Name" => $zeile["Name"] );
}
}
else {
$PageArray = -1;
}
return $PageArray;
}
/* ************************************************************************************* */
function GetTopFoldersFromId ($PageId) {
$result = mysql_query( "SELECT Name,UpperId,Id FROM AllPages WHERE Id = '$PageId'" );
if ( mysql_num_rows($result) > 0 ) {
$zeile = mysql_fetch_array($result);
$Folders = $zeile["Id"];
if ($zeile["UpperId"] != 0) {
$Folders = GetTopFoldersFromId ($zeile["UpperId"]) . "|" . $Folders;
}
}
return $Folders;
}
/* ************************************************************************************* */
function GetNavigationFromId ($StartPageId, $SpaceWidth, $ActivePage, $Recursiv, $admin) {
global $PHP_SELF;
$SpaceIMG = "<img src=\"/images/dot-x.gif\" width=\"".$SpaceWidth."\" height=\"1\" border=\"0\" align=\"middle\" alt=\"\">";
if ($SpaceWidth==0) {
$SpaceIMG = "";
$SpaceWidth = -3;
}
$array_temp = GetSubPageFromId($StartPageId, $admin);
$folder = "|" . GetTopFoldersFromId($ActivePage) . "|";
if ($array_temp!=-1) {
while(list($key,$value) = each($array_temp)) {
if (strstr($folder,"|$key|")) { $active_zusatz = "class=\"active\""; } else { $active_zusatz = ""; }
$NavigationString.= " ".$SpaceIMG."<a $active_zusatz href=\"".$PHP_SELF."?id=".$key."\" target=\"_top\">".$array_temp[$key][Name]."</a><br>\n";
if ( ($Recursiv > 0) && strstr($folder, "|".$array_temp[$key][Id]."|") ) {
$NavigationString.= GetNavigationFromId ($array_temp[$key][Id], $SpaceWidth+3, $ActivePage, $Recursiv-1, $admin);
}
}
$Recursiv--;
}
return $NavigationString;
}
|
|