Start · Sprachen · PHP · Referenz · mysql_data_seek

mysql_data_seek

Funktion

Bewegt den internen Zeiger eines MySQL-Abfrageergebnisses auf eine bestimmte Zeile, sodass die nächste Leseoperation ab dieser Zeile beginnt.

seit PHP 4.0.0 Kategorie: db

Signatur

mysql_data_seek(resource $result, int $row_number): bool

Beschreibung

mysql_data_seek() setzt den internen Zeigerposition eines Ergebnisressource auf die angegebene Zeilennummer. Dadurch kann mit nachfolgenden Funktionen wie mysql_fetch_array(), mysql_fetch_row() oder mysql_fetch_object() gezielt ab einer bestimmten Zeile des Ergebnisses gelesen werden, ohne vorherige Zeilen überspringen zu müssen.

Die Funktion ist nützlich, wenn man innerhalb eines bereits abgerufenen Ergebnisses navigieren möchte – zum Beispiel um einen Datensatz erneut zu lesen oder um in einem Ergebnissatz direkt an eine bestimmte Position zu springen. Der Zeilenindex ist nullbasiert: Die erste Zeile hat den Index 0, die letzte den Index mysql_num_rows($result) - 1.

Die gesamte mysql_*-Erweiterung wurde in PHP 5.5.0 als veraltet (deprecated) markiert und in PHP 7.0.0 vollständig entfernt. Für neuen Code sollte stattdessen mysqli_data_seek() oder die PDO-Klasse verwendet werden.

Parameter

Name Typ Default Beschreibung
$result Pflicht resource Eine MySQL-Ergebnisressource, die durch einen vorherigen Aufruf von mysql_query() zurückgegeben wurde.
$row_number Pflicht int Der nullbasierte Index der Zeile, auf die der interne Zeiger gesetzt werden soll. Muss zwischen 0 und mysql_num_rows($result) - 1 liegen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Zeiger erfolgreich bewegt wurde. Gibt false zurück, wenn die angegebene Zeilennummer ungültig ist (z. B. außerhalb des gültigen Bereichs) oder die Ressource ungültig ist.

Beispiele

Ergebnis-Zeiger auf eine bestimmte Zeile setzen

<?php
$verbindung = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $verbindung);

$ergebnis = mysql_query('SELECT id, name FROM benutzer ORDER BY id', $verbindung);

// Direkt zur dritten Zeile (Index 2) springen
if (mysql_data_seek($ergebnis, 2)) {
    $zeile = mysql_fetch_assoc($ergebnis);
    echo 'ID: ' . $zeile['id'] . ', Name: ' . $zeile['name'];
} else {
    echo 'Ungültige Zeilenposition.';
}

mysql_free_result($ergebnis);
mysql_close($verbindung);
?>
ID: 3, Name: Karl

Ergebnis zweimal durchlaufen – erster und zweiter Durchlauf

<?php
$verbindung = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $verbindung);

$ergebnis = mysql_query('SELECT id, name FROM benutzer ORDER BY id LIMIT 3', $verbindung);

// Erster Durchlauf
echo "Erster Durchlauf:" . PHP_EOL;
while ($zeile = mysql_fetch_assoc($ergebnis)) {
    echo $zeile['id'] . ': ' . $zeile['name'] . PHP_EOL;
}

// Zeiger zurück an den Anfang setzen
mysql_data_seek($ergebnis, 0);

// Zweiter Durchlauf
echo "Zweiter Durchlauf:" . PHP_EOL;
while ($zeile = mysql_fetch_assoc($ergebnis)) {
    echo $zeile['id'] . ': ' . $zeile['name'] . PHP_EOL;
}

mysql_free_result($ergebnis);
mysql_close($verbindung);
?>
Erster Durchlauf: 1: Anna 2: Bernd 3: Karl Zweiter Durchlauf: 1: Anna 2: Bernd 3: Karl

// Wichtig · Fallstricke

Veraltet und entfernt: Die gesamte mysql_*-Erweiterung wurde in PHP 5.5.0 als deprecated markiert, in PHP 5.6 als solche gewarnt und in PHP 7.0.0 vollständig entfernt. Sie sollte in keinem neuen Code verwendet werden. Als Ersatz stehen mysqli_data_seek() (prozeduraler Stil) oder PDOStatement zur Verfügung.

mysql_data_seek() funktioniert nicht mit UNBUFFERED-Abfragen (z. B. ausgeführt über mysql_unbuffered_query()), da bei ungepufferten Ergebnissen nicht alle Zeilen gleichzeitig im Speicher liegen.