Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Kleines schleifenproblem mit unset [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




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

 
Abraxax
23-01-2003, 13:37 
 
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

 
Abraxax
23-01-2003, 13:42 
 
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?

.......

 
Abraxax
23-01-2003, 13:50 
 
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

 
Abraxax
23-01-2003, 14:04 
 
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);

}

 
oms
23-01-2003, 14:18 
 
@Abraxax: Was soll denn das "reset" machen?

 
Abraxax
23-01-2003, 14:27 
 
der setzt das array zurück.

 
oms
23-01-2003, 14:34 
 
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?

 
Abraxax
23-01-2003, 16:20 
 
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

 
Abraxax
24-01-2003, 16:21 
 
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

 
Abraxax
24-01-2003, 16:26 
 
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

 
Abraxax
25-01-2003, 00:38 
 
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.= "&nbsp;&nbsp;".$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;
}


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:14 Uhr.