Start · Sprachen · PHP · Referenz · mysqli_stmt_data_seek

mysqli_stmt_data_seek

Funktion

Verschiebt den internen Ergebniszeiger eines gepufferten Prepared-Statement-Ergebnisses auf eine beliebige Zeile.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_data_seek(mysqli_stmt $statement, int $offset): void

Beschreibung

mysqli_stmt_data_seek() setzt den Zeilenzeiger eines bereits gepufferten Ergebnisses, das über ein mysqli_stmt-Objekt gewonnen wurde, auf eine frei wählbare Position. Damit kann eine bestimmte Zeile direkt angesprungen werden, ohne alle vorherigen Zeilen durchlaufen zu müssen.

Voraussetzung für den Einsatz dieser Funktion ist, dass das Ergebnis zuvor vollständig mit mysqli_stmt_store_result() in den Arbeitsspeicher gepuffert wurde. Ohne diesen Schritt ist ein Positionieren des Zeigers nicht möglich, da ein ungepuffertes Ergebnis nur vorwärts gelesen werden kann.

Die Funktion ist besonders nützlich, wenn innerhalb eines großen Ergebnisses gezielt auf bestimmte Datensätze zugegriffen werden soll – etwa beim Blättern in Datensätzen oder beim mehrfachen Auslesen bestimmter Zeilen ohne erneute Datenbankabfrage.

Der Offset ist nullbasiert: Die erste Zeile hat den Index 0, die zweite 1 usw. Ein Offset außerhalb des gültigen Bereichs führt zu undefiniertem Verhalten beim nächsten Lesen.

Parameter

Name Typ Default Beschreibung
$statement Pflicht mysqli_stmt Das mysqli_stmt-Objekt, das ein zuvor mit mysqli_stmt_store_result() gepuffertes Ergebnis enthält.
$offset Pflicht int Nullbasierte Zeilennummer, auf die der Ergebniszeiger gesetzt werden soll. Muss im Bereich von 0 bis mysqli_stmt_num_rows() - 1 liegen.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Direkt auf eine bestimmte Zeile springen

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

$stmt = $mysqli->prepare('SELECT id, name FROM users ORDER BY id');
$stmt->execute();

// Ergebnis vollständig puffern
$stmt->store_result();
$stmt->bind_result($id, $name);

$totalRows = $stmt->num_rows;
echo "Gesamt: $totalRows Zeilen\n";

// Direkt zur dritten Zeile (Index 2) springen
mysqli_stmt_data_seek($stmt, 2);
$stmt->fetch();
echo "Zeile 3: ID=$id, Name=$name\n";

// Zurück zur ersten Zeile (Index 0)
mysqli_stmt_data_seek($stmt, 0);
$stmt->fetch();
echo "Zeile 1: ID=$id, Name=$name\n";

$stmt->close();
$mysqli->close();
Gesamt: 5 Zeilen Zeile 3: ID=3, Name=Charlie Zeile 1: ID=1, Name=Alice

Rückwärts durch Ergebnisse iterieren

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

$stmt = $mysqli->prepare('SELECT id, name FROM products ORDER BY id ASC');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($id, $name);

$count = $stmt->num_rows;

// Ergebnis in umgekehrter Reihenfolge ausgeben
for ($i = $count - 1; $i >= 0; $i--) {
    mysqli_stmt_data_seek($stmt, $i);
    $stmt->fetch();
    echo "ID=$id, Name=$name\n";
}

$stmt->close();
$mysqli->close();
ID=5, Name=Produkt E ID=4, Name=Produkt D ID=3, Name=Produkt C ID=2, Name=Produkt B ID=1, Name=Produkt A

// Wichtig · Fallstricke

Wichtig: mysqli_stmt_data_seek() funktioniert nur nach einem vorherigen Aufruf von mysqli_stmt_store_result(). Ohne gepuffertes Ergebnis ist der Aufruf wirkungslos oder führt zu Fehlern.

Bei sehr großen Ergebnismengen kann das vollständige Puffern mit store_result() erheblichen Arbeitsspeicher beanspruchen. In solchen Fällen sollte überlegt werden, ob das Navigationsmuster nicht besser durch gezieltere SQL-Abfragen (z. B. mit LIMIT und OFFSET) abgebildet werden kann.

Ein Offset außerhalb des gültigen Bereichs (kleiner 0 oder größer/gleich num_rows) führt zu undefiniertem Verhalten; das nachfolgende fetch() liefert dann möglicherweise false oder falsche Daten.