Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 9 di 56
  • livello intermedio
Indice lezioni

Mysqli: fetch. Recuperare i risultati di una query

Usando mysqli abbiamo diverse possibilità per recuperare i risultati di una query sul nostro database e usarli all'interno della nostra pagina.
Usando mysqli abbiamo diverse possibilità per recuperare i risultati di una query sul nostro database e usarli all'interno della nostra pagina.
Link copiato negli appunti

MYSQLI_NUM

La prima opzione che viene proposta riguarda l'utilizzo di un array numerico, in pratica invece di usare come indice il nome del campo, o un suo alias definito in fase di query, useremo l'indice della posizione del campo nella select.

Facciamo un semplice esempio immaginando di usare la nostra solita tabella e avendo la connessione al database già a nostra disposizione. Come prima operazione definiamo la query SQL:

$query = "SELECT user, password FROM login";

e andiamo ad eseguire la nostra query:

$result = $mysqli->query($query);

A questo punto si pone il problema di recuperare i dati nella nostra pagina, la prima soluzione sarà:

$row = $result->fetch_array(MYSQLI_NUM);

La parte interessante è legata alla costante MYSQLI_NUM che rende il nostro array numerico, per rendersi conto dell'output prodotto potrebbe essere comodo fare la stampa ricorsiva dell'array $row:

print_r($row);

se poi inseriamo tutto in un ciclo while abbiamo a disposizione l'intero set dei risultati:

while($row = $result->fetch_array(MYSQLI_NUM)){
	print_r($row);
}

In questo modo si intuisce chiaramente cosa succede, la posizione 0 nel nostro campo corrisponderà al campo user, la posizione 1 al campo password. La soluzione proposta per un certo verso è comoda, dall'altra parte bisogna prestare attenzione all'SQL e in particolare alla modifica della query: alterando l'ordine dei campi estratti cambia anche il set dei risultati.

Nella pratica i contenuti potrebbero essere stampati all'interno del ciclo while usando $row[0] per lo user e $row[1] per la password, oppure impostando un ciclo che incrementa l’indice numerico.

MYSQLI_ASSOC

La seconda soluzione proposta è la via classica, ovvero l'utilizzo dell'array associativo:

while($row = $result->fetch_array(MYSQLI_ASSOC)){
	print_r($row);
}

In questo caso risulta tutto molto più lineare dato che la chiave dell'array è costituita dal nome del campo del database, o da un suo alias. Questa soluzione gode di maggior popolarità essendo più semplice da gestire e mantenere. Una volta estratti i campi tramite la query vanno usati come chiavi dell'array associativo $row['user'] e $row['password'].

MYSQLI_BOTH

La terza opzione è la somma delle due precedenti:

while($row = $result->fetch_array(MYSQLI_BOTH)){
	print_r($row);
}

L'array creato è sia numerico sia associativo quindi posso accedere allo stesso elemento sia con l'indice della sua posizione nella select della query sia con il nome del campo. Ovviamente questa comodità si paga con un oggetto dalle dimensioni maggiori del necessario e quindi con un carico di lavoro aggiuntivo per il nostro server, questo è il motivo per cui viene usata raramente.

Metodi scorciatoia

Abbiamo anche altri metodi che possono essere utilizzati, si tratta di fatto di scorciatoie:

$row = $result->fetch_row();

corrisponde a:

$row = $result->fetch_array(MYSQLI_NUM);

Il metodo fetch_assoc() implementato in questo modo:

$row = $result->fetch_assoc();

corrisponde a:

$row = $result->fetch_array(MYSQLI_ASSOC);

Mentre una variante interessante è costituita dal fetch_object che permette di gestire il risultato di ritorno come un oggetto:

while ($obj = $result->fetch_object()) {
        echo $obj->user.' '.$obj->password;
    }

fetch_all

In alcuni casi, ad esempio per inviare al client i dati prelevati dal nostro database in formato JSON, potrebbe essere comodo usare il fetch_all che ci risparmia il loop per riempire l'array da convertire; il fetch_all funziona con le costanti viste precedentemente:

$rows = $result->fetch_all(MYSQLI_ASSOC);

Possiamo poi stampare i nostri dati in formato JSON:

print JSON_encode($rows);

Un'ultima opzione è quella di usare bind_result:

$stmt = $mysqli->prepare($query);
$stmt->execute();
$stmt->bind_result($user, $password);
while ($stmt->fetch()) {
    print $nome.' '.$cognome;
}

Va ricordato che è necessario effettuare il bind prima del fetch.

Ti consigliamo anche