foreach() in while Schleife?

L

leo-magic

Aktives Mitglied
Thread Starter
Dabei seit
24.12.2004
Beiträge
1.178
Reaktionspunkte
4
Hallo!

Ich habe in einer While Schleife eine foreach() Schleife verschachtelt. Es funktioniert soweit, nur dass die while Schleife anscheinend nach dem foreach() abgebrochen wird.
-> Alles vor und mit dem foreach() wird ausgegen, Datensätze danach nicht mehr.

Konkreter:

PHP:
$result = mysql_query("SELECT user_id, GROUP_CONCAT(user_id), COUNT(project_id) As zahl
FROM users
GROUP BY project_id"
(vereinfacht)
Ich gruppiere (GROUP BY project_id) nach selben Einträgen und speichere dabei alle user_ids der dazugehörigen Gruppen. (GROUP_CONCAT(user_id))
Mit (COUNT(project_id) zähle ich, wieviele Resultate zusammen gruppiert wurden.

PHP:
while ($row = mysql_fetch_array($result))
{

$user_id = $row[0];
$mehrere_users=$row[1];
$zahl=$row[2];

//FALLS NUR EIN DATENSATZ IN DER GRUPPE
if ($zahl == 1)
{
echo("nur ein Datensatz");
}

//FALLS MEHRERE DATENSÄTZE IN GRUPPE
elseif ($zahl > 1)
{
$mehrere_users = spliti (",", $mehrere_users);

foreach ($mehrere_users as $einer_der_users)
	{
echo("<span>".$einer_der_users."</span>");
	}
}

}

Falls es mehr als 1 Datensatz in einer Gruppe gibt, werden die einzelnen (kommagetrennten id's ($mehrere_users) in ein Array aufgetrennt. (spliti (",", $mehrere_users))
Danach wird für jeder User der Gruppe (foreach()) die Ausgabe gemacht.

Alles funktioniert so, nur beginnt danach die while-Schleife nicht von neuem.
Das heisst: Solange nur ein Datensatz pro Gruppe vorkommt (if ($zahl == 1)) geht die while-Schlaufe immer weiter, sobald aber mehrere Datensätze in einer Gruppierung (group) sind (elseif ($zahl > 1)) wird diese foreach() Schleife ausgeführt, die while-Schleife aber nicht mehr weitergeführt.


Woran liegt das? Kann man das anderst lösen?

Danke!!
Léo
 
Zuletzt bearbeitet:
ich konnte das Problem leider noch immer nicht lösen... Kann mir jemand helfen?

Danke!
Léo
 
Es fehlt am Ende eine geschweifte Klammer zu. Oder ist das nur ein Copy and Paste Fehler?
Sieht ansonsten gut aus.
 
Abgesehen von einer geschweiften Klammer zu wenig am Ende und dem doppelten l in "$zahll=$row[2];" denke ich nicht, dass der Fehler im Code liegt.
Schau dir doch erstmal an, was in $result oder in den einzelnen $row steht.

In diesem Beispiel würde ich die Unterscheidung zwischen 1 und viele garnicht machen:
$mehrere_users = explode ( ',', $row[1]);
foreach ($users as $einer_der_users) {
...
 
Hallo,

Danke für Eure Antworten.

Nein, an den kleinen Tippfehlern liegt es leider nicht...

Sobald mehrere "users" vorhanden sind, und also die "if zahl > 1" Schleife mit der foeach() Schleife aufgerufen wird, wird die while Schleife abgebrochen...

Was kann ich probieren? Oder wie kann ich dem Problem auf die Schliche kommen?

Danke,
Léo
 
mach mal zu Beginn der while-Schleife ein "print_r($row)" und schau was da drin steht.

Schau auch in mysql ob Deine SQL-Abfrage auch wirklich mehrere Zeilen bringt.

Lösch erstmal den Kram dahinter raus und schau ob dann die while-Schleife mehrfach durchlaufen wird.

Dann füge Code-Teil für Code-Teil wieder ein bis die while-Schleife abgebrochen wird.

.... insgesamt sieht mir das sehr umständlich aus.

Gruß, Frank
 
Die While Schleife ohne verschachteltes foreach() funktioniert, zeigt also alle Datensätze an. Nur will ich jetzt halt noch alle gruppierten (GROUP_CONCAT) anzeigen, dafür brauch ich foreach() in der Wihle Schleife.

Irgendwo da ist wohl der Fehler, ohne das funktioniert es nämlich:

PHP:
$alluser_id = spliti (",", $alluser_id);

foreach ($alluser_id as $alluser_id)
	{

$result = mysql_query("SELECT u.user_firstname, u.user_lastname, j.status
FROM user_projects j, users u
WHERE u.user_id = '$alluser_id' AND j.project_id = '$project_id' AND j.user_id = '$alluser_id'
ORDER BY status ASC");

$row = mysql_fetch_array($result);
$user_firstname = $row[0];
$user_lastname = $row[1];
$project_status = $row[2];



echo('<div class="block"><table width="100%"><tr><td valign="top" width="100" class="border"><strong>'.$user_firstname.' '.$user_lastname.'</strong></td><td class="border">'.$project_status.'</td></tr>
					</table>
				</div>');
	}
 
DerGrund ist ein Tipfehler.

$mehrere_users = spliti (",", $mehrere_users);

foreach ($mehrere_usersd as $einer_der_users)

Die Variable heißt $mehrere_users und Du versuchst über $mehrere_usersd zu iterieren.
 
auch das ist nur ein Tippfehler... liegt leider nicht an dem...
 
Hast Du das error_reporting() auf E_ALL stehen ?
Eventuell könnte Dir das einen Hinweis geben, wenn etwas schief geht.

Ansonsten einfach mal das foreach auskommentieren und in dem Fall $zahl > 1 nach dem spliti, das übrigens deprecated ist ;), ein print_r($mehrere_users) machen, um zu sehen, was in der Variablen drinsteht.

Welcher Quelltext ist denn nun der richtige, also der, der nicht funktioniert ?
Der von gestern 22:54 ist ja mal ein komplett anderer, als der auf den ich mich bezog.

Wenn Du in einer Schleife mit Datenbankabfragen arbeitest, mußt Du natürlich entsprechend darauf achten, das Du in der zweiten Abfrage, nicht die Variablen der ersten Abfrage überschreibst.

Wenn Du in der umgebenden while-Schleife
while ($row = mysql_fetch_array($result))
schreibst, darfst Du natürlich unter keinen Umständen in dem foreach über die einzelnen User
ebenfalls $result und $row verwenden.
 
Wenn Du in der umgebenden while-Schleife
PHP:
Wenn 
while ($row = mysql_fetch_array($result))
schreibst, darfst Du natürlich unter keinen Umständen in dem foreach über die einzelnen User
ebenfalls $result und $row verwenden.

JAAAA!!! Das wars! Dummer fehler von mir!! Herzlichen DANK!!! :cake:
 
Wenn Du in der umgebenden while-Schleife

schreibst, darfst Du natürlich unter keinen Umständen in dem foreach über die einzelnen User
ebenfalls $result und $row verwenden.

Aber das hat er doch gar nicht - oder bin ich blind?

JAAAA!!! Das wars! Dummer fehler von mir!! Herzlichen DANK!!! :cake:

Ich mach gleich heute einen Termin beim Augenarzt, denn ich finde den Fehler immernoch nicht im ersten Beitrag. Hä? :kopfkratz:

Gruß, Frank
 
Jaa, mein Code ist recht umständlich, und den hier zu posten hätte wohl mehr für Verwirrung gesorgt als was anders... habe den Code darum vereinfacht hier gepostet. Wohl nich so schlau von mir ;)
 
denn ich finde den Fehler immernoch nicht im ersten Beitrag.

Der Trick ist, das man die Code beispiele 1 + 2 im Kopf zusammenführen muss, weil der wesentliche Bestandteil mit der zweiten Datenbankabfrage, im ersten Beispiel nicht drin ist . ;)
 
Zurück
Oben Unten