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 nameOgni 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| Parte | Significato |
|---|---|
$result | Un object risultato restituito da mysqli_query() (o mysqli_store_result() / mysqli_use_result()). |
| Valore restituito | Un 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()restituiscefalsein caso di errore, e passarefalseamysqli_fetch_assoc()non è valido. Controlla sempre$resultprima, 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 usamysqli_fetch_row(); per entrambe, usamysqli_fetch_array().
Confronto con altre funzioni di recupero
| Funzione | Restituisce 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.