W3docs

fetch_assoc

Scopri la funzione mysqli_fetch_assoc() in PHP, usata per recuperare una riga da un result set MySQLi come array associativo.

La funzione mysqli_fetch_assoc() recupera una riga da un result set MySQLi e la restituisce come array associativo, dove ogni chiave è il nome di una colonna della query. Questa pagina ne spiega la sintassi, il valore restituito, il comportamento all'interno di un ciclo, gli errori più comuni e le differenze rispetto alle funzioni di recupero correlate.

Cosa fa mysqli_fetch_assoc()

Quando esegui una query SELECT, MySQLi ti restituisce un result set — un puntatore alle righe corrispondenti nel database. mysqli_fetch_assoc() preleva la riga successiva da quel set e la consegna come array indicizzato per nome di colonna:

$row = mysqli_fetch_assoc($result);
echo $row['email']; // access a value by its column name

Ogni chiamata avanza un cursore interno, quindi chiamare la funzione ripetutamente scorre le righe una alla volta. Quando non ci sono più righe, restituisce null.

Sintassi

mysqli_fetch_assoc(mysqli_result $result): array|null|false
ParteSignificato
$resultUn object risultato restituito da mysqli_query() (o mysqli_store_result() / mysqli_use_result()).
Valore restituitoUn array associativo per la riga recuperata, null quando non ci sono più righe, oppure false in caso di errore.

Se due colonne nella tua SELECT condividono lo stesso nome (ad esempio un JOIN che restituisce due colonne id), nell'array sopravvive solo l'ultima — usa gli alias di colonna (SELECT a.id AS user_id) per mantenerle entrambe.

Recupero delle righe in un ciclo

Nella maggior parte dei casi si chiama mysqli_fetch_assoc() all'interno di un ciclo while. Poiché restituisce null (falsy) dopo l'ultima riga, il ciclo termina automaticamente:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "shop");

if (mysqli_connect_errno()) {
    die("Connection failed: " . mysqli_connect_error());
}

$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");

if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo $row['id'] . ": " . $row['name'] . " ($" . $row['price'] . ")\n";
    }
    mysqli_free_result($result);
} else {
    echo "Query failed: " . mysqli_error($mysqli);
}

mysqli_close($mysqli);
?>

Verifichiamo la connessione con mysqli_connect_errno(), eseguiamo la query, poi iteriamo. A ogni iterazione la riga successiva viene assegnata a $row; quando il set è esaurito l'assegnazione produce null, la condizione del while diventa false e il ciclo si ferma. mysqli_free_result() libera la memoria occupata dal result set una volta terminato il lavoro.

Osservare l'array restituito

Non è necessario un database per capire la struttura di una riga. Lo snippet seguente costruisce un array identico a quello che restituirebbe una singola chiamata a mysqli_fetch_assoc() e lo stampa, in modo da vedere le chiavi corrispondenti ai nomi delle colonne:

<?php
// This is the structure mysqli_fetch_assoc() hands back for one row.
$row = [
    "id"    => 1,
    "name"  => "Keyboard",
    "price" => 29.99,
];

echo "Product: " . $row["name"] . "\n";
echo "Price:   $" . $row["price"] . "\n";

print_r($row);
?>

L'esecuzione produce:

Product: Keyboard
Price:   $29.99
Array
(
    [id] => 1
    [name] => Keyboard
    [price] => 29.99
)

Errori comuni

  • Chiamarla su una query fallita. mysqli_query() restituisce false in caso di errore, e passare false a mysqli_fetch_assoc() non è valido. Controlla sempre $result prima, come nel ciclo sopra.
  • Dimenticare che restituisce una sola riga. Una singola chiamata ti dà la riga successiva, non l'intera tabella. Usa un ciclo per leggerle tutte.
  • Usare == invece dell'assegnazione. Il ciclo usa $row = mysqli_fetch_assoc($result) (assegnazione). Scrivere == non farebbe mai avanzare il cursore e potrebbe ciclare all'infinito.
  • Trattarla come accesso numerico. Usa $row['name'], non $row[0]. Per le chiavi numeriche usa mysqli_fetch_row(); per entrambe, usa mysqli_fetch_array().

Confronto con altre funzioni di recupero

FunzioneRestituisce ogni riga come
mysqli_fetch_assoc()Array associativo ($row['name'])
mysqli_fetch_row()Array numerico ($row[0])
mysqli_fetch_array()Sia chiavi associative che numeriche
mysqli_fetch_object()Un object ($row->name)
mysqli_fetch_all()Un array di tutte le righe in una volta

Scegli mysqli_fetch_assoc() quando vuoi un codice leggibile e auto-documentante che fa riferimento alle colonne per nome e stai elaborando le righe una alla volta.

Conclusione

mysqli_fetch_assoc() è la funzione di riferimento per leggere un result set MySQLi come array associativi indicizzati per nome di colonna. Combinala con un ciclo while e una rapida verifica che la query sia riuscita, e potrai iterare i result set in modo sicuro. Per approfondire, consulta PHP MySQLi, gli array associativi e il ciclo while.

Esercitazione

Pratica
Cosa fa la funzione fetch_assoc() in PHP?
Cosa fa la funzione fetch_assoc() in PHP?
Was this page helpful?