fetch_lengths
Erfahren Sie mehr über die PHP-Funktion mysqli_fetch_lengths(), die ein Array mit den Spaltenlängen der aktuellen Zeile eines MySQLi-Ergebnisses zurückgibt.
In diesem Artikel befassen wir uns mit der Funktion mysqli_fetch_lengths() in PHP. Sie gibt ein array zurück, das die Längen jeder Spalte in der aktuellen Zeile eines MySQLi-Ergebnisses enthält. Wir erklären die Syntax, Rückgabewerte, das objektorientierte Äquivalent, häufige Anwendungsfälle und die typischen Fallstricke.
Was mysqli_fetch_lengths() macht
Die Funktion mysqli_fetch_lengths() ist eine in PHP eingebaute Funktion, die die Längen – in Bytes – jedes Spaltenwerts in der zuletzt abgerufenen Zeile eines MySQLi-Ergebnisses zurückgibt. Sie liest die Zeile selbst nicht; stattdessen meldet sie die Byte-Länge jeder Spalte in der Zeile, auf die der Ergebniszeiger aktuell zeigt.
Das ist wichtig, weil MySQL alles, was es an den Client sendet, als Bytes speichert – die Länge entspricht der tatsächlichen Größe der zurückgegebenen Daten, nicht der definierten Maximalgröße der Spalte. Eine VARCHAR(255)-Spalte, die den string "hello" enthält, meldet zum Beispiel eine Länge von 5, nicht 255. Bei mehrbytiger (UTF-8) Text ist die Länge die Anzahl der Bytes, die größer sein kann als die Anzahl der Zeichen.
Syntax
mysqli_fetch_lengths(mysqli_result $result): array|false$result— ein Ergebnisobjekt, das vonmysqli_query(),mysqli_store_result()odermysqli_use_result()zurückgegeben wurde.- Rückgabe: ein numerisch indiziertes array mit den Spaltenlängen der aktuellen Zeile, oder
false, wenn noch keine Zeile abgerufen wurde (oder bei einem Fehler).
Wann man es verwendet
mysqli_fetch_lengths() kommt zum Einsatz, wenn die Größe der zurückgegebenen Daten genauso wichtig ist wie die Daten selbst:
- Verarbeitung von Binary/BLOB-Spalten, bei denen die genaue Byte-Anzahl vor der Verarbeitung benötigt wird.
- Defensive Prüfungen – Bestätigung, dass eine Spalte tatsächlich Daten zurückgegeben hat und kein leerer string ist.
- Protokollierung, Debugging oder Diagnosen darüber, wie viele Daten jede Abfrage zurückgibt.
Da die Funktion vom Zeilenzeiger abhängt, muss sie nach einem Abruf (mysqli_fetch_row(), mysqli_fetch_array() oder mysqli_fetch_assoc()) und vor dem nächsten Abruf, der den Zeiger weiterbewegt, aufgerufen werden.
Verwendung der Funktion mysqli_fetch_lengths()
mysqli_fetch_lengths() arbeitet auf dem aktuellen Zeilenzeiger, daher wird sie typischerweise innerhalb einer Abrufschleife aufgerufen, direkt nach dem Abrufen einer Zeile:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);
if ($result) {
while ($row = mysqli_fetch_row($result)) {
$lengths = mysqli_fetch_lengths($result);
if ($lengths !== false) {
for ($i = 0; $i < count($lengths); $i++) {
printf("Length of column %d: %d\n", $i, $lengths[$i]);
}
}
}
}
mysqli_close($mysqli);
?>In diesem Beispiel verbinden wir uns mit der Datenbank und führen eine Abfrage aus. Wir prüfen, ob Verbindung und Abfrage erfolgreich waren. Innerhalb der while-Schleife bewegt mysqli_fetch_row() den Zeilenzeiger zur nächsten Zeile. Anschließend rufen wir mysqli_fetch_lengths() auf, um ein array mit den Spaltenlängen dieser Zeile zu erhalten. Da die Funktion bei einem Fehler false zurückgibt, prüfen wir das Ergebnis, bevor wir mit einer for-Schleife durch die Längen iterieren und sie ausgeben.
Objektorientierter Stil
Dieselbe Operation steht als Methode des mysqli_result-Objekts zur Verfügung. Der meiste moderne Code verwendet diesen Stil:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("Connection failed: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT id, name FROM my_table");
if ($result) {
while ($row = $result->fetch_row()) {
$lengths = $result->lengths; // property, not a method call
printf("id length: %d, name length: %d\n", $lengths[0], $lengths[1]);
}
}
$mysqli->close();
?>Im OOP-Stil werden die Längen als schreibgeschützte $result->lengths-Eigenschaft und nicht als Methode bereitgestellt.
Häufige Fallstricke
- Nach einem Abruf aufrufen, nicht davor. Wird
mysqli_fetch_lengths()aufgerufen, bevor eine Zeile abgerufen wurde, gibt siefalsezurück – der Zeilenzeiger hat nichts zu messen. - Längen sind in Bytes angegeben. Bei mehrbytiger Text (wie UTF-8) kann die Byte-Länge die Zeichenanzahl übersteigen. Verwenden Sie
mb_strlen(), wenn Sie stattdessen eine Zeichenanzahl benötigen. - Sie spiegelt nur die aktuelle Zeile wider. Ein erneuter Aufruf nach dem Abrufen der nächsten Zeile liefert die Längen für die neue Zeile – speichern Sie das array, wenn Sie die vorherigen Werte benötigen.
NULL-Spalten melden eine Länge von0, genauso wie ein leerer string – kombinieren Sie dies mit dem abgerufenen Wert, wenn Sie zwischen beiden unterscheiden müssen.
Verwandte Funktionen
mysqli_fetch_row()— eine Zeile als numerisches array abrufen (wird häufig mit dieser Funktion kombiniert).mysqli_fetch_array()undmysqli_fetch_assoc()— eine Zeile als numerisches/assoziatives oder assoziatives array abrufen.mysqli_fetch_fields()— Metadaten (Name, Typ, Maximallänge) zu jeder Spalte abrufen.mysqli_field_count()— die Anzahl der Spalten der letzten Abfrage ermitteln.
Fazit
Die Funktion mysqli_fetch_lengths() ist ein praktisches Werkzeug, um die Byte-Größe jeder Spalte in der aktuellen Zeile eines MySQLi-Ergebnisses abzurufen. Denken Sie daran, dass sie auf der zuletzt abgerufenen Zeile arbeitet, Längen in Bytes zurückgibt und false liefert, wenn keine Zeile verfügbar ist – wer diese Regeln im Kopf behält, kann sie zuverlässig in seinen Datenbankworkflows einsetzen.