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.