molily: datensätze auslesen

Beitrag lesen

Hallo, Michael,

Diese fetch-Routine liefert offenbar eine ganze Zeile Deiner Tabelle
zurück.
Aus der nachfolgenden Adressierung schließe ich, daß sie als Hash oder
Verweis auf einen Hash oder irgendwas in dieser Art geliefert wird.

Hash? ;) Gut dass es in PHP keine feste Trennung zwischen numerisch indizierten und assoziativen Arrays gibt. mysql_fetch_assoc() gibt aber, wie du sagst, einen assoziativ indizierten Array zurück (sagt man das so? mir fehlen die Grundlagen), hinzu kommen mysql_fetch_row() für numerische Indizes und mysql_fetch_array() für beides oder auch als Ersatz für die beiden speziellen Funktionen, nur ein entsprechender Parameter ist nötig.

(Übrigens keine Methode, die ich Dir empfohlen hätte - wenn Du nicht
alle Zeilen auf einmal brauchst, dann wäre es besser, direkt nach je-
dem "fetch" die Zeile auszuwerten, das frißt weniger Arbeitsspeicher.)

Einfache Frage: Wieso? Auf dem ersten Blick erscheint es logisch, aber auf den zweiten Blick merkt man, dass das komplette MySQL-Resultat schon im Speicher vorhanden ist, denn die Abfrage ist schon längst abgeschlossen, wenn die Arrays daraus "gefetcht" werden. Ich kenne die PHP-Interna nicht, aber ich nehme an, dass die MySQL-Daten erst zeilenweise in von PHP (bzw. C) bearbeitbare Daten umgewandelt werden (der Vorgang des Fetchens :)).
Nämlich wenn schon direkt nach der MySQL-Query die kompletten Ergebnisdaten in ein für PHP verarbeitbares Format umgewandelt werden, wäre das zeilenweise Auslesen eine Farce, da die Daten Zeile für Zeile im Speicher verdoppelt würden, wenn man sie in eine Variable/einen Array schreibt. Denn intern würde ein Art verschachtelter Array bereits existieren.

Wie sehen denn die MySQL-Ergebnisdaten aus, gibt es dort überhaupt so etwas wie eine Datensatztrennung, welche es ermöglicht, einen Teil des Results zu lesen, ohne dass gleich das komplette Result geparst/umgewandelt werden muss?

Ich bearbeite MySQL-Ergebnisse zwar auch immer zeilenweise und sehe auch ein, dass es klug sein mag, aber ob es wirklich notwendig (weil ökonomisch) ist, ist bei einer nicht speichernahen Sprache wie PHP nicht einfach erkennbar.

Und das klebt anscheinend eine Ausgabezeile zusammen, wobei die
Elemente "idk", "name" und "vorname" aus dem hash (?) entnommen werden,

Ja, PHP nennt es wohl assoziativer Array, obwohl Hash auch sprachübergreifend bekannt sein sollte, aber da man in PHP einen solchen Array auch über Indizes ansprechen kann, sagt man wohl eher schlicht "Array". :) (Ich liebe PHP für eine fast dämliche Einfachheit... ;) Ergo didaktisch wertlos. :))

Der Trick ist, den Bruch zwischen den beiden Universen zu verstehen. SQL denkt in Mengen; PHP etc. denken in Listen, Schleifen, endlichen Variablen. Also läßt sich eine Menge von Zeilen nicht durch eine ein fache Zuweisung aus der Datenbank ziehen,

Doch, eben das passiert: eine MySQL-Abfrage liefert *alle* Datensätze (dürfte in Perl nicht anders sein?). Danach hat PHP die gesamten Ergebnisdaten im Speicher und man kann sie aber nur zeilenweise "abrufen"...
Noch bevor das Result durch mysql_(result|fetch_*) bearbeitet wird, kann man die Verbindung zur Datenbank schließen, die Datenbank wird also nur einmal befragt, nicht zeilenweise.

sondern nur durch eine Schleife über die gefundenen Zeilen

"Wieso?" Wieso gibt eine keine Funktion, die ein komplettes Result (alle gefundenen Datensätze) in einen Array "überführt"? Wenn man arraytypische Operationen durchführen will, ist es sinnlos, die Datensätze einzeln in einen Array einzusortieren, denn der vom Result belegte Speicher kann erst über mysql_free_result freigegeben werden, wenn bereits ein Duplikat des kompletten Arrays im Speicher vorhanden ist. Man müsste also vermeiden, dass dies überhaupt passieren kann...

Sicherlich wirde eine "mysql_fetch_all"-Funktion missbraucht werden und die Performance und die Speichernutzung wäre gräßlich, wenn man sie falsch anwendet, aber davon abgesehen wäre es sicherlich effizienter als wenn man in einer Interpretersprache eine Funktion x-mal in einer Schleife aufruft, das ist nur unnötige Übersetzungsarbeit.

Wenn man bedenkt dass man mit mysql_data_seek() immerhin innerhalb des Results herumspringen kann, also würde man einen Zeiger innerhalb eines Arrays setzen, dann muss das Result definitiv schon *vor* jeglichem fetch_*-Aufruf in einer arrayförmigen Speicherstruktur vorhanden sein... *mutmaß*
Wenn man zudem bedenkt, dass mysql_unbuffered_query() *während* die Anfrage noch läuft schon Datensätze liefern kann, dann verhärtet sich mein Verdacht immens...

*g* Schon lustig, wenn man keine Ahnung hat, aber Theorien aufstellt. ;) Vielleicht kann irgendjemand mit meinen Untersuchungen etwas anfangen oder kann mir weiterhelfen...

Grüße,
Mathias