Seite 1 von 1

foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 02:11
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

Re: foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 09:35
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>";
}

Re: foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 10:04
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*

Re: foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 10:41
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...

Re: foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 14:24
von achim89
wuhu :grin:
danke für die mühe und erklärungen
jetzt versteh ichs =)

Re: foreach liefert immer selbe ergebnisse

Verfasst: 22.05.2009 14:42
von oxpus
Gern geschehen.
Man hilft eben wo man kann.