fetch_all
Panoramica della funzione mysqli_fetch_all() in PHP per recuperare tutte le righe di un result set MySQLi come array associativo o numerico.
La funzione mysqli_fetch_all() recupera tutte le righe di un result set MySQLi in una sola chiamata e le restituisce come un unico array bidimensionale. Invece di iterare con mysqli_fetch_assoc() riga per riga, si ottiene l'intero result set in un'unica operazione — comodo quando si desidera passare i dati a un template, codificarli come JSON o elaborarli in blocco.
Questo articolo tratta la sintassi, le costanti per il tipo di risultato, il valore restituito, esempi pratici e le insidie più comuni.
Sintassi e parametri
mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array| Parametro | Descrizione |
|---|---|
$result | Un object mysqli_result restituito da mysqli_query(), mysqli_store_result() o mysqli_use_result(). |
$mode | Opzionale. Controlla come viene indicizzata ogni riga. Uno tra MYSQLI_ASSOC, MYSQLI_NUM (predefinito) o MYSQLI_BOTH. |
Valore restituito: un array bidimensionale contenente tutte le righe. Se il result set è vuoto, restituisce un array vuoto [].
| Costante | Ogni riga è indicizzata per |
|---|---|
MYSQLI_ASSOC | Nomi di colonna ($row['name']). |
MYSQLI_NUM | Indici numerici delle colonne ($row[0]). Questo è il valore predefinito. |
MYSQLI_BOTH | Sia nomi che indici numerici. |
Nota:
mysqli_fetch_all()richiede il driver mysqlnd. È disponibile dal PHP 5.3 e funziona sia con lo stile procedurale mostrato qui sia con lo stile orientato agli oggetti$result->fetch_all().
Come usare mysqli_fetch_all()
Chiama la funzione su un result set valido dopo aver eseguito una query. Qui recuperiamo ogni riga come array associativo:
<?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) {
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach ($rows as $row) {
echo $row['column1'] . " - " . $row['column2'] . "\n";
}
}
mysqli_close($mysqli);
?>Passo per passo: mysqli_connect() apre la connessione e ne verifichiamo il successo per evitare un errore fatale successivo. mysqli_query() esegue la SELECT e restituisce un mysqli_result. Chiamiamo quindi mysqli_fetch_all($result, MYSQLI_ASSOC), che restituisce un array di questo tipo:
[
['column1' => 'Anna', 'column2' => 'NYC'],
['column1' => 'Bob', 'column2' => 'LA'],
]Poiché ogni riga è indicizzata per nome di colonna, il ciclo foreach legge direttamente $row['column1'] e $row['column2'].
Recupero come array numerico o combinato
L'argomento $mode cambia il modo in cui vengono indicizzate le righe. Passa MYSQLI_NUM per ottenere indici numerici, oppure MYSQLI_BOTH per avere sia nomi che indici in ogni riga. Qui recuperiamo un array numerico:
<?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) {
$rows = mysqli_fetch_all($result, MYSQLI_NUM);
foreach ($rows as $row) {
echo $row[0] . " - " . $row[1] . "\n";
}
}
mysqli_close($mysqli);
?>Qui le righe vengono restituite con indice posizionale, quindi leggiamo le prime due colonne come $row[0] e $row[1]. Con MYSQLI_BOTH sia $row[0] che $row['column1'] punterebbero allo stesso valore — utile quando si sta migrando codice, ma raddoppia la memoria utilizzata da ogni riga.
fetch_all() vs. fetch_assoc() in un ciclo
mysqli_fetch_all() carica l'intero result set in memoria PHP in una volta sola, liberandoti dal dover ciclare. Al contrario, mysqli_fetch_assoc() recupera una riga per chiamata, quindi un ciclo while elabora le righe una alla volta:
// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column1'] . " - " . $row['column2'] . "\n";
}Usa mysqli_fetch_all() quando il result set è di dimensioni piccole o moderate e vuoi tutte le righe insieme (ad es. per codificarle con json_encode()). Preferisci il ciclo while con mysqli_fetch_assoc() per result set molto grandi, dove caricare tutto in una volta potrebbe esaurire la memoria.
Insidie comuni
$resultdeve essere valido. Se la query fallisce,mysqli_query()restituiscefalse, non un object risultato — controlla sempre prima di recuperare i dati, come mostrano gli esempi.- I result set vuoti non sono un errore. Quando nessuna riga corrisponde, si ottiene
[]e ilforeachnon esegue nulla. - Usa sempre le prepared statement con input non attendibile. La
SELECT * FROM my_tableletterale mostrata sopra non riceve input dall'utente; per qualsiasi dato dinamico, associa i parametri per prevenire SQL injection.
Funzioni correlate
mysqli_fetch_assoc()— recupera una riga alla volta come array associativo.mysqli_fetch_array()— recupera una riga come associativo, numerico o entrambi.mysqli_fetch_row()— recupera una riga come array numerico.mysqli_fetch_object()— recupera una riga come object.mysqli_query()— esegue la query che produce il result set.
Conclusione
mysqli_fetch_all() è il modo più rapido per trasferire un intero result set MySQLi in un array PHP. Scegli MYSQLI_ASSOC per chiavi leggibili basate sul nome di colonna, MYSQLI_NUM per chiavi numeriche compatte, oppure MYSQLI_BOTH quando hai bisogno di entrambe. Ricorda che carica tutte le righe in memoria, quindi per set di dati di grandi dimensioni un ciclo riga per riga con mysqli_fetch_assoc() è la scelta più sicura.