fetch_row
Guida alla funzione mysqli_fetch_row() in PHP: sintassi, valore restituito, cicli su result set e differenze con le alternative.
La funzione mysqli_fetch_row() recupera una riga da un result set MySQLi e la restituisce come array enumerato — un semplice array con indici numerici in cui $row[0] corrisponde alla prima colonna selezionata, $row[1] alla seconda, e così via. Questa pagina tratta la sintassi e il valore restituito, come iterare su un result set, gli stili procedurale e orientato agli oggetti, quando preferirla rispetto alle alternative e i problemi da tenere d'occhio.
Sintassi
// Procedural style
mysqli_fetch_row(mysqli_result $result): array|null|false
// Object-oriented style
$result->fetch_row(): array|null|falseL'unico argomento è $result — un object risultato restituito da mysqli_query(), mysqli_store_result() o mysqli_use_result().
Valore restituito
| Situazione | Valore restituito |
|---|---|
| Una riga è stata letta | Un array enumerato ($row[0], $row[1], …) |
| Nessuna altra riga | null |
| Errore | false |
Ogni chiamata avanza un cursore interno alla riga successiva, il che permette di usarla in modo pulito all'interno di un ciclo while. I valori delle colonne vengono restituiti come string (o null per i valori SQL NULL), indipendentemente dal tipo SQL della colonna, a meno che non si abiliti la conversione nativa dei tipi tramite mysqlnd.
Esempio base: iterare sulle righe
Poiché mysqli_fetch_row() restituisce null quando le righe sono esaurite, la condizione del ciclo termina da sola:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
die("Connection failed: " . mysqli_connect_error());
}
$result = mysqli_query($mysqli, "SELECT id, name FROM users");
if ($result) {
while ($row = mysqli_fetch_row($result)) {
// $row[0] = id, $row[1] = name (in the order they were SELECTed)
printf("%s: %s\n", $row[0], $row[1]);
}
mysqli_free_result($result);
} else {
echo "Query failed: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Ci colleghiamo, verifichiamo eventuali errori di connessione e poi eseguiamo una SELECT. All'interno del ciclo while, ogni chiamata a mysqli_fetch_row() restituisce la riga successiva come array indicizzato nell'ordine della SELECT — ed è esattamente per questo che si raccomanda di selezionare colonne esplicite (id, name) invece di SELECT *: in questo modo si fissa quale indice corrisponde a quale colonna.
Suggerimento: Chiama sempre
mysqli_free_result()quando hai terminato di usare un result set per liberarne la memoria, specialmente negli script a lunga esecuzione.
Stile orientato agli oggetti
La stessa logica con l'API OOP, che la maggior parte del codice moderno utilizza:
<?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 users");
while ($row = $result->fetch_row()) {
printf("%s: %s\n", $row[0], $row[1]);
}
$result->free();
$mysqli->close();
?>Quando usare mysqli_fetch_row()
Usa mysqli_fetch_row() quando:
- Selezioni un insieme ridotto e fisso di colonne e preferisci un accesso compatto tramite indice.
- Stai copiando o trasmettendo righe grezze e i nomi delle colonne non sono rilevanti.
- Vuoi il fetch con il minor overhead possibile (non viene costruito alcun array con chiavi associative).
Preferisci una delle alternative quando i nomi o gli object sono più comodi:
mysqli_fetch_assoc()— restituisce un array associativo indicizzato per nome di colonna ($row['name']). Più leggibile e robusto se l'ordine della SELECT cambia.mysqli_fetch_array()— restituisce sia chiavi numeriche che associative.mysqli_fetch_object()— restituisce ogni riga come object ($row->name).mysqli_fetch_all()— restituisce tutte le righe in una volta in un singolo array.
Problemi comuni
- Gli indici seguono l'ordine della SELECT, non quello della tabella.
SELECT *rende$rowfragile perché aggiungere una colonna alla tabella sposta silenziosamente gli indici. Seleziona le colonne in modo esplicito. - I valori sono string. Una colonna numerica viene restituita come
"42", non42. Fai un cast ((int) $row[0]) se hai bisogno di un numero reale. nullvs.false. Un ciclowhiletratta entrambi come falsy, quindi termina correttamente in entrambi i casi — ma se recuperi una singola riga manualmente, distingui "nessun'altra riga" (null) da "errore" (false).- Buffered vs. unbuffered. Con
mysqli_use_result()(unbuffered) devi recuperare tutte le righe prima di eseguire un'altra query sulla stessa connessione.
Per una panoramica più ampia sulla connessione e le query, consulta la panoramica MySQLi e mysqli_connect().