Thomas: mysql_fetch_array - weiß einfach nicht mehr weiter

Hallo Leute!

Ich hab folgende kleine Test-Datenbank:

ID - NAME
----------
1    Klaus
2    Albert
3    Susi
4    Norbert

Nun fehlt mir hier die alphabetische Ordnung, was ich bei der Ausgabe der Datensätze korregieren möchte.

Ich lese die Datensätze ein:

$data = "SELECT name FROM db ORDER BY name";

Jetzt hab ich sie so geordnet wie ich will.

So geh ich weiter:

$result = mysql_query($data, $conn); # $conn ist hier die DB-Verbindungsvariable

$test = mysql_fetch_array($result, MYSQL_NUM);

Jetzt kommt das Problem. Eigentlich müsste das Array ja nun so aussehen:

0 Albert
1 Klaus
2 Norbert
3 Susi

Wenn ich $test[0] auslese, kommt auch Albert, wie gewollt, aber bei [1], [2] und [3] kommt gar nix :o(

Weiß jemand Rat?

Wenn ich per mysql_num_rows abprüfe, hat es schon 4 Datensätze eingelesen, es kann nur noch daran liegen, dass er mir nicht alle 4 ins Array mit reinnimmt.

Gruß, Thomas

  1. hi!

    $test = mysql_fetch_array($result, MYSQL_NUM);

    mysql_fetch_array() liest immer nur eine einzige Zeile ein. Du musst
    also zum Beispiel mit einer while-Schleife so lange Zeilen einlesen
    -- und dabei jedesmal wieder mysql_fetch_array() aufrufen -- bis du
    alle Ergebnisse hast.

    Lies dir mal in der PHP-Dokumentation den entsprechenden Abschnitt[1]
    durch. Besonders das Beispiel dort dürfte für dich wohl interessant
    sein.

    bye, Frank!

    [1] http://www.php.net/manual/en/function.mysql-fetch-array.php

    1. Hallo Frank!

      Hab Deinen Rat befolgt und konnte es auch mit einer While-Schleife lösen.

      Hier mein kleines Testscript:

      $dada = "SELECT nick FROM friends ORDER BY nick";

      $didi = mysql_query($dada, $conn);
      $row = mysql_num_rows($didi);

      $i = 0;

      while ($row = mysql_fetch_array($didi)){

      echo $row[0];
      echo "<br>";
      $i++;
      }

      Als Ergebnis werden alle Datensätze schön geordnet untereinander gestellt.

      Das ist schon mal gut, nur siehst Du ja, dass ich jedesmal $row[0] neu ersetze und aufrufe.

      Nur möchte ich die Daten natürlich in $row[0], $row[1], $row[2],... usw. haben.

      Ich habs mit $row[$i] im Script versucht, aber das verursacht nur Fehler.

      Weißt Du weiter?

      Gruß, Thomas

      1. Moin!

        Nur möchte ich die Daten natürlich in $row[0], $row[1], $row[2],... usw. haben.

        Du willst das Abfrageergebnis aus der Datenbank nicht (noch nicht) wirekt ausgeben, sondern in ein Array speichern?

        Ich habs mit $row[$i] im Script versucht, aber das verursacht nur Fehler.

        Wenn du es korrekt gemacht hättest, wäre es gegangen. :)

        Zunächst mal: $row ist als Variable nur einmal vorhanden. Du weist ihr einmal das Ergebnis von mysql_num_rows zu, und später dann die Ergebnisse von mysql_fetch_array. Das hat möglicherweise unerwünschte Nebeneffekte.

        Aber zum Thema:

        $abfrage = "SELECT nick FROM friends ORDER BY nick";

        $sqlergebnis = mysql_query($abfrage, $conn);

        $anzzeilen = 0;
        while ($zeilen[] = mysql_fetch_array($sqlergebnis))
        {$anzzeilen++;}

        So simpel kann es sein. Die Zuweisung $zeilen[] = irgendwas (also die Angabe eines Arrays ohne Index) hängt ein neues Element hinten an das Array dran. Am Anfang existiert das Array noch garnicht, dann wird es angelegt.

        Auf diese Weise wird ein Array gefüllt mit den einzelnen Zeilen der SQL-Abfrage.

        Dabei ist anzumerken: Die Elemente des Arrays $zeilen sind wiederum Arrays.

        Du greifst dann also mit $zeilen[0]['nick'] auf die Spalte 'nick' der Abfrage zu (nimm besser diesen Hash-Zugriff anstatt die numerische Variante $zeilen[0][0], dann weißt du auch später noch, was du da machst, und wenn deine Abfrage keine Spalte 'nick' enthält, sondern aus Versehen 'passwort', kann dir nicht passieren, daß stattdessen diese ausgegeben wird.

        Logischerweise gibts auch $zeilen[1]['nick'] und so weiter bis zu maximal $zeilen[$anzzeilen-1]['nick'].

        Du kannst also mit einer einfachen FOR-Schleife alle Zeilen ausgeben:

        for ($i=0;$i<$anzzeilen;$i++);
        {
        echo $zeilen[$i]['nick']."<br>\n";
        }

        Nur mal so als Beispiel.

        - Sven Rautenberg