foreach liefert immer selbe ergebnisse

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
achim89

foreach liefert immer selbe ergebnisse

Beitrag von achim89 »

hallo

seit kurzem wage ich mich an php, jedoch bereitet es mir doch mehr probleme als gedacht
ich habe ein fehler bei meiner foreach schleife, weiß aber nicht worin er liegt

in meiner datenbank speichere ich uploads anhand des dateinamens (zeitstring) den typ und die benutzerid die uploadedte
es tauchen in meiner datenbank mehrere user mit je mehreren files auf
deshalb mache ich

Code: Alles auswählen

$abfrage = "select * from files where user = '".$_SESSION["id"]."'";
  $ergebnis = mysql_query($abfrage);
  $dsatz = mysql_fetch_assoc($ergebnis);
das heißt ja, frage alles ab, bei dem der datensatz beim user der seiner ID ist

und später

Code: Alles auswählen

foreach($dsatz as $file)
  {
    /* code ausgeschnitten */
      
    echo "    <td><center>"; fct_preview($dsatz["type"], $dsatz["filename"], $dsatz["time"]);
    echo "        </center></td>";
    echo "    <td><center>"; fct_stamp_to_string($dsatz["time"]);
    echo "        </center></td>";
    echo "    <td><center>";
    echo          $dsatz["size"]." Kb</center></td>";
    echo "    <td><center>Link zum verschicken:";
    echo "        <br><input value='***URL****/download.php?stamp=".$dsatz["user"]."&time=".$dsatz["time"]."'></td>";
    echo "    <td><center>Anzahl der Downloads:";
    echo "        <br>".$dsatz["downloads"]."</center></td>";
    echo "    <td><center><a href='delete.php?file=".$dsatz["time"]."'>";
                  fct_show_icon("delete.png");
    echo "        </center></td>";
    echo "</tr>";
  }
jedoch listet mir, auch wenn nur 1 passender datensatz besteht, immer 5 identische ergebnisse
Benutzeravatar
oxpus
Ehemaliges Teammitglied
Beiträge: 5395
Registriert: 03.02.2003 12:33
Wohnort: Bad Wildungen
Kontaktdaten:

Re: foreach liefert immer selbe ergebnisse

Beitrag von oxpus »

Hallo,

du machst hier einen Denkfehler:
Mit

Code: Alles auswählen

$dsatz = mysql_fetch_assoc($ergebnis);
werden die Daten eines Datensatzes aus der Tabelle in das Array $dsatz geladen.
Da dieser Datensatz nun 5 Felder und damit auch 5 Array-Keys enthält, führt die von dir aufgebaute foreach-Abfrage auch immer zu 5 Durchläufen. Du bewegst dich also innerhalb des Datensatzes.

Wenn es aber um den Datensatz selber geht und es mehr als einen Datensatz je Session-ID geben kann, wäre das Script so aufzubauen:

Code: Alles auswählen

$abfrage = "select * from files where user = '".$_SESSION["id"]."'";
$ergebnis = mysql_query($abfrage);
while ($dsatz = mysql_fetch_assoc($ergebnis))
{
	/* code ausgeschnitten */
	
	echo "    <td><center>"; fct_preview($dsatz["type"], $dsatz["filename"], $dsatz["time"]);
	echo "        </center></td>";
	echo "    <td><center>"; fct_stamp_to_string($dsatz["time"]);
	echo "        </center></td>";
	echo "    <td><center>";
	echo          $dsatz["size"]." Kb</center></td>";
	echo "    <td><center>Link zum verschicken:";
	echo "        <br><input value='***URL****/download.php?stamp=".$dsatz["user"]."&time=".$dsatz["time"]."'></td>";
	echo "    <td><center>Anzahl der Downloads:";
	echo "        <br>".$dsatz["downloads"]."</center></td>";
	echo "    <td><center><a href='delete.php?file=".$dsatz["time"]."'>";
	fct_show_icon("delete.png");
	echo "        </center></td>";
	echo "</tr>";
}
Grüße
OXPUS
Kein Support bei unaufgeforderten PNs, E-Mails oder auf anderem Weg!!
achim89

Re: foreach liefert immer selbe ergebnisse

Beitrag von achim89 »

oh vielen vielen dank
nun versteh ich es auch
sonst hat ich einfach immer nur ein ergebnis

ich dachte man löst das mit foreach aber foreach springt einfach nur die felder im array rum

danke danke *thumbsup*
Benutzeravatar
oxpus
Ehemaliges Teammitglied
Beiträge: 5395
Registriert: 03.02.2003 12:33
Wohnort: Bad Wildungen
Kontaktdaten:

Re: foreach liefert immer selbe ergebnisse

Beitrag von oxpus »

ich dachte man löst das mit foreach aber foreach springt einfach nur die felder im array rum
Jein. Das kommt auf den Aufbau des Arrays an und die Behandlung in foreach.

In deiner ursprünglichen Bedingung

Code: Alles auswählen

$dsatz as $file
würde foreach jeweils den Array-Key des betreffenden Feldes herausziehen und damit (weil der Datensatz in diesem Fall ja 5 Felder hat) die Schleife auch je Satz 5 mal starten.
Wäre allerdings das Array for der Schleife mit einem zusätzlichen Zähler je Datensatz aufgebaut worden, würde foreach() mit der gleichen Behandlungsanweisung auch jeden Satz wir gewünscht behandeln. Dann allerdings stünden die Feldinhalte für die Darstellung in $file und nicht "direkt" in $dsatz.

Um das zu verdeutlichen:
Du lädst mit

Code: Alles auswählen

$dsatz = mysql_fetch_assoc($ergebnis)
einen Datensatz aus der Datenbanktabelle komplett in einen Array-Satz in $dsatz.
Dieser schaut dann so aus:

Code: Alles auswählen

$dsatz['type'] = ...
$dsatz['time'] = ...
$dsatz['size'] = ...
$dsatz['user'] = ...
$dsatz['downloads'] = ...
Die "..." sind jeweils dann die Werte dahinter.

Code: Alles auswählen

foreach ($dsatz as $file)
löst demnach das Array auf und packt jeweils den Array-Key (also type, time, size, user und downloads) in $file.
Nur, wenn das Array $dsatz so abgefragt würde

Code: Alles auswählen

$dsatz[] = $row
wobei $row dann in einer Schleife mit

Code: Alles auswählen

$row = mysql_fetch_assoc($ergebnis)
gefüllt wird, baut sich das Array so auf:

Code: Alles auswählen

$dsatz[0]['type'] = ...
$dsatz[0]['time'] = ...
$dsatz[0]['size'] = ...
$dsatz[0]['user'] = ...
$dsatz[0]['downloads'] = ...
$dsatz[1]['type'] = ...
$dsatz[1]['time'] = ...
$dsatz[1]['size'] = ...
$dsatz[1]['user'] = ...
$dsatz[1]['downloads'] = ...
$dsatz[n]['type'] = ...
$dsatz[n]['time'] = ...
$dsatz[n]['size'] = ...
$dsatz[n]['user'] = ...
$dsatz[n]['downloads'] = ...
Hier sind 0, 1, n die "Zähler" des Arrays, hinter dem das jeweils nächste Array (verschachtelt) vorhanden ist.
Verwendet man dann hierauf

Code: Alles auswählen

foreach ($dsatz as $file)
so wird dann $file das jeweilige Array eines Datensatzes erhalten.
Das, was mit meiner Änderung direkt in $dsatz steht, wenn die while-Schleife einmal durchläuft...
Grüße
OXPUS
Kein Support bei unaufgeforderten PNs, E-Mails oder auf anderem Weg!!
achim89

Re: foreach liefert immer selbe ergebnisse

Beitrag von achim89 »

wuhu :grin:
danke für die mühe und erklärungen
jetzt versteh ichs =)
Benutzeravatar
oxpus
Ehemaliges Teammitglied
Beiträge: 5395
Registriert: 03.02.2003 12:33
Wohnort: Bad Wildungen
Kontaktdaten:

Re: foreach liefert immer selbe ergebnisse

Beitrag von oxpus »

Gern geschehen.
Man hilft eben wo man kann.
Grüße
OXPUS
Kein Support bei unaufgeforderten PNs, E-Mails oder auf anderem Weg!!
Antworten

Zurück zu „Coding & Technik“