Start · Sprachen · PHP · Referenz · mysqli_fetch_lengths

mysqli_fetch_lengths

Funktion

Gibt ein Array mit den Byte-Längen der Spaltenwerte der aktuell abgerufenen Zeile einer <code>mysqli_result</code>-Ergebnismenge zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_fetch_lengths(mysqli_result $result): array|false

Beschreibung

mysqli_fetch_lengths() liefert ein numerisch indiziertes Array, das die Längen der einzelnen Spaltenwerte (in Bytes) der zuletzt mit mysqli_fetch_row(), mysqli_fetch_assoc() oder mysqli_fetch_array() abgerufenen Zeile enthält. Der Index entspricht dabei dem Spaltenindex (beginnend bei 0).

Die Funktion ist besonders nützlich, wenn man mit BLOB-Spalten oder sehr langen Textfeldern arbeitet und wissen möchte, wie viele Bytes ein bestimmter Wert tatsächlich belegt, ohne die Daten selbst zunächst mit strlen() ausmessen zu müssen. Dies kann relevant sein, wenn Binärdaten Null-Bytes enthalten, die strlen() verfrüht beenden würden.

Die Funktion kann nur aufgerufen werden, nachdem eine Zeile aus der Ergebnismenge abgerufen wurde. Wird sie vor dem ersten Fetch oder nach dem Ende der Ergebnismenge aufgerufen, gibt sie false zurück. Die zurückgegebenen Längen beziehen sich immer auf die aktuell im Ergebnis-Buffer stehende Zeile.

Im objektorientierten Stil steht die Eigenschaft $result->lengths zur Verfügung, die äquivalent zur prozeduralen Funktion ist.

Parameter

Name Typ Default Beschreibung
$result Pflicht mysqli_result Das mysqli_result-Objekt, das durch einen vorherigen Aufruf von mysqli_query(), mysqli_store_result() oder mysqli_use_result() erzeugt wurde.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein numerisch indiziertes Array zurück, das die Byte-Längen jeder Spalte der aktuellen Zeile enthält. Gibt false zurück, wenn keine aktuelle Zeile vorhanden ist (d. h. wenn noch kein Fetch-Aufruf erfolgte oder die Ergebnismenge erschöpft ist).

Beispiele

Byte-Längen aller Spalten einer Zeile ausgeben

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

$result = $mysqli->query("SELECT id, username, bio FROM users LIMIT 1");

if ($row = $result->fetch_assoc()) {
    $lengths = mysqli_fetch_lengths($result);
    // Alternativ OOP: $lengths = $result->lengths;

    $fields = $result->fetch_fields();
    foreach ($fields as $index => $field) {
        echo "Spalte '{$field->name}': " . $lengths[$index] . " Bytes\n";
    }
}

$result->free();
$mysqli->close();
Spalte 'id': 1 Bytes Spalte 'username': 8 Bytes Spalte 'bio': 42 Bytes

Binäre BLOB-Daten korrekt mit Byte-Länge auslesen

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

// BLOB kann Null-Bytes enthalten – strlen() wäre hier unzuverlässig
$result = $mysqli->query("SELECT id, file_data FROM uploads LIMIT 1");

if ($row = mysqli_fetch_row($result)) {
    $lengths = mysqli_fetch_lengths($result);

    $blobLength = $lengths[1]; // Index 1 = Spalte 'file_data'
    echo "Tatsächliche BLOB-Größe: {$blobLength} Bytes\n";

    // strlen() könnte bei Null-Bytes falsche Werte liefern:
    echo "strlen() meldet:        " . strlen($row[1]) . " Bytes\n";
}

$result->free();
$mysqli->close();
Tatsächliche BLOB-Größe: 204800 Bytes strlen() meldet: 204800 Bytes

// Wichtig · Fallstricke

Aufruf-Reihenfolge beachten: mysqli_fetch_lengths() muss nach einem Fetch-Aufruf aufgerufen werden. Wird sie davor oder nach dem Ende der Ergebnismenge aufgerufen, gibt sie false zurück. Ein häufiger Fehler ist das Aufrufen nach mysqli_data_seek() ohne anschließendem Fetch.

Binärdaten: Bei BLOB-Spalten ist die von mysqli_fetch_lengths() zurückgegebene Länge die einzig verlässliche Methode zur Größenbestimmung, da strlen() bei Strings mit eingebetteten Null-Bytes (\0) falsche Werte liefern kann.

OOP-Äquivalent: Im objektorientierten Stil kann statt der Funktion direkt die Eigenschaft $result->lengths genutzt werden.