W3docs

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
ParametroDescrizione
$resultUn object mysqli_result restituito da mysqli_query(), mysqli_store_result() o mysqli_use_result().
$modeOpzionale. 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 [].

CostanteOgni riga è indicizzata per
MYSQLI_ASSOCNomi di colonna ($row['name']).
MYSQLI_NUMIndici numerici delle colonne ($row[0]). Questo è il valore predefinito.
MYSQLI_BOTHSia 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

  • $result deve essere valido. Se la query fallisce, mysqli_query() restituisce false, 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 il foreach non esegue nulla.
  • Usa sempre le prepared statement con input non attendibile. La SELECT * FROM my_table letterale mostrata sopra non riceve input dall'utente; per qualsiasi dato dinamico, associa i parametri per prevenire SQL injection.

Funzioni correlate

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.

Esercitazione

Pratica
Cosa restituisce mysqli_fetch_all() quando viene chiamata su un result set?
Cosa restituisce mysqli_fetch_all() quando viene chiamata su un result set?
Was this page helpful?