W3docs

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|false

L'unico argomento è $result — un object risultato restituito da mysqli_query(), mysqli_store_result() o mysqli_use_result().

Valore restituito

SituazioneValore restituito
Una riga è stata lettaUn array enumerato ($row[0], $row[1], …)
Nessuna altra riganull
Errorefalse

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 $row fragile 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", non 42. Fai un cast ((int) $row[0]) se hai bisogno di un numero reale.
  • null vs. false. Un ciclo while tratta 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().

Pratica

Pratica
Quali delle seguenti affermazioni sono vere riguardo alla funzione PHP mysqli_fetch_row()?
Quali delle seguenti affermazioni sono vere riguardo alla funzione PHP mysqli_fetch_row()?
Was this page helpful?