Start · Sprachen · PHP · Referenz · mysqli_data_seek

mysqli_data_seek

Funktion

Verschiebt den internen Ergebniszeiger eines <code>mysqli_result</code>-Objekts auf eine bestimmte Zeile.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_data_seek(mysqli_result $result, int $offset): bool

Beschreibung

mysqli_data_seek() setzt den Ergebniszeiger eines mysqli_result-Objekts auf die durch offset angegebene Zeilennummer. Nachfolgende Aufrufe von mysqli_fetch_row(), mysqli_fetch_assoc() oder ähnlichen Fetch-Funktionen liefern dann die Daten ab dieser Position.

Die Funktion ist besonders nützlich, wenn man in einem Ergebnissatz mehrfach navigieren möchte – etwa um bestimmte Zeilen wiederholt zu lesen oder einen Ergebnissatz rückwärts zu durchlaufen. Der Offset ist nullbasiert, d. h. die erste Zeile hat den Index 0.

Wichtig: mysqli_data_seek() funktioniert nur mit gepufferten Ergebnissen (also mit mysqli_query() oder mysqli_store_result()). Bei ungepufferten Ergebnissen, die mit mysqli_use_result() erzeugt wurden, schlägt die Funktion fehl, da der gesamte Ergebnissatz nicht im Speicher gehalten wird.

Sie ist das prozedurale Gegenstück zur objektorientierten Methode mysqli_result::data_seek().

Parameter

Name Typ Default Beschreibung
$result Pflicht mysqli_result Das mysqli_result-Objekt, das von mysqli_query(), mysqli_store_result() oder mysqli_get_result() zurückgegeben wurde.
$offset Pflicht int Der nullbasierte Zeilenindex, auf den der Ergebniszeiger gesetzt werden soll. Gültige Werte liegen zwischen 0 und mysqli_num_rows($result) - 1.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Zeiger erfolgreich gesetzt wurde, andernfalls false – z. B. wenn der Offset außerhalb des gültigen Bereichs liegt oder das Ergebnis ungepuffert ist.

Beispiele

Ergebniszeiger auf eine bestimmte Zeile setzen

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

if ($mysqli->connect_errno) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$result = mysqli_query($mysqli, 'SELECT id, name FROM users ORDER BY id');

if ($result === false) {
    die('Abfrage fehlgeschlagen: ' . $mysqli->error);
}

// Zeiger auf die dritte Zeile (Index 2) setzen
if (mysqli_data_seek($result, 2)) {
    $row = mysqli_fetch_assoc($result);
    echo 'Dritter Eintrag: ID=' . $row['id'] . ', Name=' . $row['name'];
} else {
    echo 'Zeiger konnte nicht gesetzt werden (Offset außerhalb des Bereichs)';
}

mysqli_free_result($result);
$mysqli->close();
Dritter Eintrag: ID=3, Name=Charlie

Ergebnissatz rückwärts durchlaufen

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

$result = mysqli_query($mysqli, 'SELECT id, name FROM users ORDER BY id');

$numRows = mysqli_num_rows($result);

echo 'Einträge in umgekehrter Reihenfolge:' . PHP_EOL;

for ($i = $numRows - 1; $i >= 0; $i--) {
    mysqli_data_seek($result, $i);
    $row = mysqli_fetch_assoc($result);
    echo 'ID=' . $row['id'] . ', Name=' . $row['name'] . PHP_EOL;
}

mysqli_free_result($result);
$mysqli->close();
Einträge in umgekehrter Reihenfolge: ID=5, Name=Eve ID=4, Name=Dave ID=3, Name=Charlie ID=2, Name=Bob ID=1, Name=Alice

// Wichtig · Fallstricke

Nur mit gepufferten Ergebnissen: mysqli_data_seek() schlägt stillschweigend fehl, wenn das Ergebnis mit mysqli_use_result() (ungepufferter Modus) erzeugt wurde. Stellen Sie sicher, dass Sie mysqli_query() oder mysqli_store_result() verwenden.

Speicherverbrauch: Gepufferte Ergebnisse werden vollständig im Arbeitsspeicher gehalten. Bei sehr großen Ergebnismengen kann dies zu einem hohen Speicherverbrauch führen. In solchen Fällen sollte die SQL-Abfrage selbst optimiert werden (z. B. mit LIMIT).

Der gültige Offset-Bereich liegt von 0 bis mysqli_num_rows($result) - 1. Ein Offset außerhalb dieses Bereichs gibt false zurück, ohne eine PHP-Warnung auszulösen.