Eine SQL-Abfrage nicht mehrmals abfragen

Manchmal kommt es vor, dass man eine bestimmte SQL-Abfrage bzw. das Ergebnis dieser innerhalb eines Scripts mehrmals benötigt. Ein ResultSet kann allerdings nur einmal durchlaufen werden. Man müsste deshalb die gleiche Query weiter unten im Script noch einmal abfragen. Aber da diese Daten ja bereits geholt worden, ist eine solche Abfrage eigentlich eine Verschwendung von Performance. WIe gehts aber besser?

Hier ncohmal der Code, der ersten Abfrage:

$einlesen = mysql_query("SELECT spalte1,spalte2 FROM table WHERE spalte3='wert'");
while($einzeln = mysql_fetch_assoc($einlesen)) {
  echo $einzeln['spalte1']." ".$einzeln['spalte2'];
}

Diese Daten benötigen wir allerdings weiter unten noch einmal. Nun könnte man sich die Daten in dieser Schleife bereits in Arrays schreiben, allerdings gibt es einen eleganteren Weg: mysql_data_seek().

Mit der Funktion mysql_data_seek() kann man den Zeiger eines Resultsets an eine gewünschte Position zurückschieben. Weil wir alle Daten noch einmal benötigen (ab Zeiger auf Ergebnisdatensatz 0), verwenden wir mysql_data_seek($einlesen,0);

Somit kann weiter unten im gleichen Script wieder mit der Schleife wie oben die Ergebnisliste durchlaufen werden. Man sollte dann natürlich zwischendurch die Variable $einlesen nicht mit irgendetwas anderem belegen.

Jan hat 152 Beiträge geschrieben

3 Kommentare zu “Eine SQL-Abfrage nicht mehrmals abfragen

  1. Tim sagt:

    Wenn ich den Inhalt öfters im Script benötige, speichere ich sie meistens in einer Variable ab. Mir ist noch nicht vorgekommen, dass ich bestimmte Datensätze öfters im Script verwende, weil ich das meistens direkt in der while-Loop erledige. Die Funktion mysql_data_seek / mysqli_data_seek ist eine schöne Möglichkeit. Allerdings weiß ich nicht, ob diese Funktion mit simplen Arrays mithalten kann, weil die Daten direkt in einer Variable gespeichert werden können und der Umweg über mysql_data_seek / mysqli_data_seek sendet einen Request an die Datenbank. Auf schnellen Servern mit lokaler Datenbank werden das natürlich geringe Unterschiede sein, aber was, wenn die Datenbank „außerhalb“ nicht auf dem gleichen Server wie der PHP Interpreter liegt? Das heißt ja, dass PHP an die Datenbank einen Request senden muss und dann noch die Daten abfragt.
    Könntest du vielleicht einen Benchmark zum Thema Datenbankzugriff machen (MySQL, MySQLi, SQLite). Danke!

    Gruß
    Tim

  2. GhostGambler sagt:

    „Das heißt ja, dass PHP an die Datenbank einen Request senden muss und dann noch die Daten abfragt.“
    Wo hast du das denn her?

    Ich finde nur das hier
    http://dev.mysql.com/doc/refman/5.1/en/mysql-data-seek.html
    Und das wiederum führt mich zu dem hier
    http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html
    Und das wiederum lässt darauf schließen, dass selbst wenn noch eine Abfrage an die Datenbank statt findet, die Daten jedoch trotzdem nicht neu übertragen werden (was ja auch keinen Sinn macht – die Queries werden ja nicht umsonst beim Client gelagert; Stichwort buffered und unbuffered Queries)

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>