Mehrere while Schleifen ineinander
Hallo zusammen,
ich glaube, meine Frage ist ziemlich leicht zu beantworten, da sie, wahrscheinlich, einfach nur auf einem Denkfehler beruht^^. Dennoch sitze ich jetzt seit einiger Zeit daran und finde keine Lösungsmöglichkeit, auch mit dem Inkrement einer Variable, damit eine Schleife nur einmal ausgeführt wird, führt nicht zum gewünschten Ergebnis. Vielleicht kann mir hier ja jemand weiterhelfen, bzw. hatte das gleiche Problem auch mal ;-)
Erstmal zum Vorhaben: Ich hole aus einer MySQL Datenbank die Spalte "Namen", diese Spalte beinhaltet, wer hät's gedacht, einige Namen. Der zweite Teil ist, dass ich mit der php Funktion "opendir" ein Verzeichnis auf dem Server öffne und alle Verzeichnisse dahinter auslese. Sprich: Ich öffne mit php den Ordner Namen, dann listet er mir die Verzeichnisse (sind mit Namen betitelt) dahinter auf. Soweit so gut, einzelnd funktioniert das auch super. Das Problem kommt erst, wenn ich beides gleichzeitig mache, dazu später mehr... Am Ende möchte ich die Namen, die ich aus der Datenbank geholt habe, von den Verzeichnisnamen abziehen, dies erfolgt mit string replace.
Nun der Code:
$abfrage = "SELECT Name FROM blabla ORDER BY ID ASC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo $row->Name;
if ($handle = opendir('../../../Namen/')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
echo $file;
}
}
closedir($handle);
}
}
In der ersten while Schleife hole ich den Inhalt aus der Datenbank und gebe ihn aus, passt, dann öffne ich das Verzeichnis "Namen" auf dem Server und lasse die Verzeichnisse dahinter auflisten. Als Seitenoutput bekomme ich jetzt allerdings den ersten Namen der Datenbank, dann die Verzeichnisse auf dem Server, dann wieder ein Name der Datenbank und die Verzeichnisse auf dem Server, dann wieder ein Name der Datenbank usw. Ist logisch, da ich ja beide while Schleifen ineinander verschachtelt habe, somit bekomme ich jedes Mal, wenn etwas aus der Datenbank geholt wird, den Serverinhalt mit. Das soll aber nicht sein...
Nun zu meiner Frage: Wie bekomme ich es hin, dass ich $row->Name (erste while) von $file (zweite while) abziehen kann, ohne dass mir hunderte Sachen (while Ergebnisse) ausgegeben werden? Irgendwie stehe ich auf dem Schlauch...
Über eine Antwort und eine kurze Erklärung würde ich mich wirklich sehr freuen!
Grüße, Hummel
4 Antworten
Lagere die 2. While Schleife aus (wird somit nur 1x ausgeführt und nicht immer wieder) und speichere die Ordnernamen in Arrays:
$server_dirs = $db_dirs = array();
if ($handle = opendir('../../../Namen/')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$server_dirs[] = $file;
}
}
closedir($handle);
$abfrage = "SELECT Name FROM blabla ORDER BY ID ASC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)) {
$db_dirs[] = $row->Name;
}
#Ziehe die gefundenen Server-Verzeichnisse von denen in der Datenbank ab
$cleaned_dirs = array_diff($db_dirs, $server_dirs);
print_r($cleaned_dirs);
Im Array $cleaned_dirs sind nun alle übrig gebliebene Verzeichnisse drin und können weiter verarbeitet werden.
Hallo,
erstmal sorry für die relativ späte Antwort, ich bin leider noch nicht dazu gekommen, hier zu antworten.
Vielen Dank für diese sehr hilfreiche Antwort! Ich bringe mir php alleine bei und habe mich noch nicht mit arrays beschäftigt, daher kam ich auch noch nicht auf die Idee, die ganzen Werte darin zu speichern, aber genau das löst mein Problem! Anfangs hatte ich immer versucht, die Datenbankwerte in einer normalen Variable zu speichern, die übernimmt allerdings immer nur den ersten Wert der Datenbank, logischerweise. Du hast mir also sehr weitergeholfen, vielen Dank!
Explizit für mein Vorhaben: Dein Code hat genau das bewirkt, was er soll. Er funktioniert einwandfrei, vielen Dank. Allerdings wollte ich die Datenbankwerte von den Serverwerten abziehen, nciht andersrum. Das ist aber einfach mit einem Tausch von array_diff möglich, stellte also kein weiteres Problem dar.
Nochmals vielen Dank, die Antwort hat mir sehr geholfen!
Grüße, Hummel
Denkansatz ändern und Schritt für Schritt arbeiten. Erst sauber die Namen abfragen.
Während des ersten While eine neue Array füttern mit Ordnern die gefunden wurden.
Anschliesen eine foreach aus dieser neuen Array und in dieser noch ein While der ersten Abfrage - kurzum -
prüfe für jeden Ordner den du gefunden hast alle Daten aus der MySQL Abfrage
Mein Tipp - verabschiede dich von While - pack die Abfrage in eine Variable und arbeite mit foreach
Bei Fragen -> schreib bei Facebook (siehe profil)
Hallo ceetrox,
dein Weg hat letztendlich zur Lösung geführt - vielen Dank!
DavidHubners Antwort habe ich letztendlich übernommen.
Grüße, Hummel
Das Problem liegt wahrscheinlich hier :
while($row = mysql_fetch_object($ergebnis))
{
echo $row->Name;
// Hier sollte dann die Klammer hin
if ($handle = opendir('../../../Namen/')) {
Hier müsste die Klammer meiner Ansicht nach geschlossen werden. Anosnsten wird - wie du beschreibst- zuerst der Erste Name, dann die Verzeichnisse und dann der zweite Name und weider die Verzeichnisse ausgegeben (und so weiter). Probier also einfach mal, die Klammer hinter dem Echo wieder zu schließen .
Stimmt, die while Schleifen durften nicht ineinader verlaufen. Danke!
Im Zusammenspiel mit arrays hat es dann geklappt...
etwas unklar deine frage. verstehe nicht, was du mit "abziehen" meinst, trotzdem:
if ($handle = opendir("../../../Namen/$row->Name")) {
beachte: " statt '
Das stimmt zwar, hilft mir aber bei meinem Problem nicht weiter ;-)
DavidHubner hat mir bereits geholfen, dennoch vielen Dank.
da fehlt noch eine geschweifte Klammer zu nach