L'estensione MySQLi per l'interazione tra PHP e MYSQL
Pagina 5 di 5
5. Estrazione dei record
Una volta eseguita una query, tramite l'estensione MySQLi è possibile utilizzare alcune funzioni appositamente dedicate all'estrazione dei record; in questa parte della trattazione verrà presa in analisi la funzione mysqli_fetch_array() che consente di visualizzare tutti i record coinvolti da una determinata interrogazione; tale funzione, molto simile alla corrispondente mysql_fetch_array() dell'estensione MySQL, produce un array accettando come parametro il risultato di una query; questo array può essere di diverso tipo sulla base del secondo parametro passato a mysqli_fetch_array():
- MYSQLI_NUM: genera un array numerico;
- MYSQLI_ASSOC: genera un array associativo;
- MYSQLI_BOTH: genera simultaneamente un array numerico e associativo.
<?php
// estrazione dei dati con mysqli_fetch_array()
// connessione al database
$link = @mysqli_connect("localhost", "username", "password", "data");
// controllo sullo stato della connessione
if (mysqli_connect_errno())
{
echo "Connessione fallita: " . die (mysqli_connect_error());
}
// esecuzione della query
$query = "SELECT nome FROM prova ORDER by id DESC";
$result = @mysqli_query($link, $query);
// controllo sul numero dei record coinvolti
if(@mysqli_num_rows($result)!=0)
{
// risultato sotto forma di array numerico
while($row = mysqli_fetch_array($result, MYSQLI_NUM))
{
echo $row[0] . "<br>";
}
// risultato sotto forma di array asscociativo
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
{
echo $row['nome'] . "<br>";
}
// risultato sotto forma di array numerico o associativo
while($row = mysqli_fetch_array($result, MYSQLI_BOTH))
{
echo $row['nome'] . "<br>";
echo $row[0] . "<br>";
}
}
// liberazione della memoria dal risultato della query
@mysqli_free_result($result);
// chiusura della connessione
@mysqli_close($link);
?>
I valori presenti all'interno di un array prodotto tramite mysqli_fetch_array() potrà essere sviluppato attraverso un ciclo; nel caso in cui il flag associato come parametro alla funzione si MYSQLI_NUM, verrà prodotto un array di tipo numerico in cui i valori presenti all'interno del vettore saranno indicizzati da "0" a "n", dove "n" è l'ultimo numero indice dell'array; nell'esempio proposto viene effettuata un'interrogazione che coinvolge un solo campo, quindi l'unico indice disponibile sarà "0".
Nel caso in cui invece il secondo argomento della funzione sia MYSQLI_ASSOC, verrà prodotto un array associativo in cui i valori verranno indicizzati tramite il nome dei campi coinvolti dalla query; nel caso dell'esempio proposto, vengono estratti unicamente i valori relativi al campo "nome" della tabella "prova", per cui l'unico indice presente nell'array associativo sarà appunto "nome".
MYSQLI_BOTH ("both" significa appunto in lingua Inglese "entrambi"), produce un array numerico e associativo, quindi sarà possibile sia riferirsi agli indici da "0" a "n" che a quelli che hanno come nome il nome dei campi che forniscono i record tramite query.
Naturalmente, anche per la funzione mysqli_fetch array() esiste un metodo corrispondente denominato mysqli_result::fetch_array; il codice seguente mostra un esempio dell'utilizzo di questo metodo all'interno di un contesto orientato agli oggetti:
<?php
// estrazione dei dati con il metodo mysqli_result::fetch_array
// connessione al database per istanza
$mysqli = @new mysqli("localhost", "username", "password", "data");
// controllo sullo stato della connessione
if (mysqli_connect_errno())
{
echo "Connessione fallita: " . die (mysqli_connect_error());
}
// esecuzione della query
$query = "SELECT nome FROM prova ORDER by id DESC";
$result = @$mysqli->query($query);
// controllo sul numero dei record coinvolti
if(@$result->num_rows > 0)
{
// risultato sotto forma di array numerico
while($row = $result->fetch_array(MYSQLI_NUM))
{
echo $row[0] . "<br>";
}
// risultato sotto forma di array asscociativo
while($row = $result->fetch_array(MYSQLI_ASSOC))
{
echo $row['nome'] . "<br>";
}
// risultato sotto forma di array numerico o associativo
while($row = $result->fetch_array(MYSQLI_BOTH))
{
echo $row['nome'] . "<br>";
echo $row[0] . "<br>";
}
}
// liberazione della memoria dal risultato della query
@$result->close();
// chiusura della connessione
@$mysqli->close();
?>
A livello funzionale, la differenza tra l'approccio procedurale e quello orientato agli oggetti è veramente molto sottile; in questo secondo caso la connessione avviene per istanza, a questo punto sarà possibile sottoporre la query al metodo mysqli::query e passarla come parametro al metodo mysqli_result::fetch_array che, sottoposto a ciclo while, mostrerà i risultati come valori di array di tipo diverso (numerici o associativi) a seconda del flag passato come secondo argomento alla funzione.
Nel primo esempio è stato effettuato un controllo sul numero dei record coinvolti dalla query utilizzando la funzione mysqli_num_rows(), a questa funzione corrisponde un metodo, denominato mysqli_result->num_rows, che potrà essere utilizzato in applicazioni la cui costruzione segue il paradigma object oriented, come nel secondo esempio proposto.







