fetch_lengths
Guida alla funzione mysqli_fetch_lengths() in PHP: sintassi, valori restituiti, stile OOP e casi d'uso comuni con MySQLi.
In questo articolo ci concentreremo sulla funzione mysqli_fetch_lengths() in PHP. Restituisce un array contenente le lunghezze di ciascuna colonna nella riga corrente di un result set MySQLi. Ne spiegheremo la sintassi, i valori di ritorno, l'equivalente orientato agli oggetti, i casi d'uso più comuni e i problemi da tenere a mente.
Cosa fa mysqli_fetch_lengths()
La funzione mysqli_fetch_lengths() è una funzione built-in di PHP che restituisce le lunghezze — in byte — del valore di ogni colonna nella riga recuperata più di recente da un result set MySQLi. Non legge la riga in sé; riporta invece la lunghezza in byte di ciascuna colonna nella riga su cui si trova attualmente il puntatore del result set.
Questo è importante perché MySQL invia tutto al client come byte, e la lunghezza rappresenta la dimensione effettiva dei dati restituiti — non la dimensione massima definita per la colonna. Ad esempio, una colonna VARCHAR(255) che contiene la stringa "hello" riporta una lunghezza di 5, non 255. Per il testo multibyte (UTF-8), la lunghezza è il numero di byte, che può essere superiore al numero di caratteri.
Sintassi
mysqli_fetch_lengths(mysqli_result $result): array|false$result— un object result restituito damysqli_query(),mysqli_store_result(), omysqli_use_result().- Restituisce: un array indicizzato numericamente con le lunghezze delle colonne per la riga corrente, oppure
falsese non è ancora stata recuperata alcuna riga (o in caso di errore).
Quando usarla
Si ricorre a mysqli_fetch_lengths() quando la dimensione dei dati restituiti è importante quanto i dati stessi:
- Gestione di colonne binary / BLOB in cui è necessario il conteggio esatto dei byte prima dell'elaborazione.
- Controlli difensivi — per verificare che una colonna abbia effettivamente restituito dati anziché una stringa vuota.
- Logging, debug o diagnostica sulla quantità di dati restituiti da ciascuna query.
Poiché dipende dal puntatore di riga, va chiamata dopo un fetch (mysqli_fetch_row(), mysqli_fetch_array(), o mysqli_fetch_assoc()) e prima che il fetch successivo faccia avanzare il puntatore.
Come usare la funzione mysqli_fetch_lengths()
mysqli_fetch_lengths() opera sul puntatore della riga corrente, quindi di solito la si chiama all'interno di un ciclo di fetch, subito dopo aver recuperato una riga:
<?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 questo esempio ci connettiamo al database ed eseguiamo una query. Verifichiamo che la connessione e la query abbiano avuto successo. All'interno del ciclo while, mysqli_fetch_row() fa avanzare il puntatore di riga alla riga successiva. Chiamiamo poi mysqli_fetch_lengths() per ottenere un array con le lunghezze delle colonne per quella riga. La funzione restituisce false in caso di errore, quindi verifichiamo il risultato prima di scorrere le lunghezze con un ciclo for per stamparle.
Stile orientato agli oggetti
La stessa operazione è disponibile come metodo sull'object mysqli_result. La maggior parte del codice moderno utilizza questo stile:
<?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();
?>Si noti che nello stile OOP le lunghezze sono esposte come proprietà di sola lettura $result->lengths, non come metodo.
Problemi comuni
- Chiamarla dopo un fetch, non prima. Se si chiama
mysqli_fetch_lengths()prima di aver recuperato qualsiasi riga, restituiscefalse— il puntatore di riga non ha nulla da misurare. - Le lunghezze sono in byte. Per il testo multibyte (come UTF-8), la lunghezza in byte può superare il conteggio dei caratteri. Usare
mb_strlen()se si ha bisogno del conteggio dei caratteri. - Riflette solo la riga corrente. Chiamarla di nuovo dopo aver recuperato la riga successiva fornisce le lunghezze di quella nuova riga, quindi conservare l'array se si hanno bisogno dei valori precedenti.
- Le colonne
NULLriportano una lunghezza di0, proprio come una stringa vuota — combinare il risultato con il valore recuperato se è necessario distinguerle.
Funzioni correlate
mysqli_fetch_row()— recupera una riga come array numerico (comunemente abbinata a questa funzione).mysqli_fetch_array()emysqli_fetch_assoc()— recuperano una riga come array numerico/associativo o solo associativo.mysqli_fetch_fields()— ottiene i metadati (nome, tipo, lunghezza massima) di ciascuna colonna.mysqli_field_count()— restituisce il numero di colonne nell'ultima query.
Conclusione
La funzione mysqli_fetch_lengths() è uno strumento pratico per recuperare la dimensione in byte di ciascuna colonna nella riga corrente di un result set MySQLi. Ricordare che opera sulla riga recuperata più di recente, restituisce le lunghezze in byte e produce false quando nessuna riga è disponibile — tenendo a mente queste regole è possibile integrarla in modo affidabile nei propri flussi di lavoro con il database.