Commenti(0)
PHP MySQL Tutorial di base - Lezione 9 - mysql_fetch_array
Rimaniamo sulla 'lettura' di dati da una tabella MySQL, ma questa volta leggeremo tutto il contenuto della tabella attraverso una struttura ciclica. La sintassi che useremo sarà la stessa della lezione precedente, ma con qualche accorgimento e qualche utile suggerimento sulle 'trappole' da evitare!
PHP – MySQL: mysql_fetch_array
In termini da programmatori, il termine 'fetch' indica la lettura di un dato in modo sequenziale, come ad esempio la lettura di un file riga per riga, o di un array indice per indice. Nel nostro caso, si tratta della lettura di un resultset, che in realtà non è altro che un array a 2 dimensioni.
Questo termine proviene dai primissimi linguaggi di programmazione, dove l'istruzione 'fetch' indicava il caricamento di istruzioni (che erano anche esse di tipo sequenziale) in memoria, da far eseguire al processore.
Perchè utilizzare il comando 'mysql_fetch_array'?
Come abbiamo visto nella precedente lezione, dopo aver eseguito il comando 'mysql_query', se stiamo leggendo dati da una tabella, l'operazione da eseguire sarà 'mysql_fetch_array' che abbiamo già utilizzato per leggere una sola riga di un database. In questa lezione scopriremo come utilizzare lo stesso comando, in modo ciclico, per leggere un intero resultset.
Prendiamo come spunto la query eseguita nell'esempio precedente:
Otteniamo in questo modo, nella variabile $result, un'insieme di dati da leggere attraverso la funzione 'mysql_fetch_array()' la quale ci restituirà un array contenente una riga del nostro resultset ogni volta che la invocheremo.
Se vogliamo quindi leggere, e visualizzare a video tutta la tabella 'impiegati' tramite una pagina PHP, il codice che dovremo andare a scrivere sarà il seguente:
Lettura di dati da una tabella MySQL con PHP:
1<?php 2// Stabiliamo una connessione MySQL 3mysql_connect("localhost", "root", "") or die(mysql_error()); 4mysql_select_db("test") or die(mysql_error()); 5 6// Eseguiamo la SELECT sulla tabella 'impiegati' 7$result = mysql_query("SELECT * FROM impiegati") 8or die(mysql_error()); 9 10// eseguiamo la nostra 'mysql_fetch_array' in un ciclo 'while' 11while($row = mysql_fetch_array($result)){ 12 // Visualizziamo sulla pagina il contenuto della riga letta 13 echo "Nome: ".$row['nome']." - Livello: ".$row['livello']."<br />"; 14} 15?>
Risultato:
>>> Nome: Simona Neri - Livello: 3
>>> Nome: Paolo Rossi - Livello: 4
>>> Nome: Mario Bianchi - Livello: 3
Come possiamo notare, la differenza tra questo esempio e quello della lezione precedente è veramente minimo: non abbiamo fatto altro che inserire il comando '$row=mysql_fetch_array($result)' all'interno di un ciclo while, che - ad ogni esecuzione - andrà a verificare che la variabile $row non conterrà un valore 'false'. In quel caso vorrà dire che siamo arrivati alla fine del resultset e quindi non abbiamo più dati da visualizzare a video.
E' estremamente importante, quando creiamo delle strutture iterative, cioè, sequenze di istruzioni che si ripetono per un certo numero di volte, che ci sia una situazione d'uscita, cioè, una condizione che prima o poi dovrà verificarsi e che causerà l'interruzione del ciclo di istruzioni.
Nel nostro esempio, la condizione di uscita dal ciclo 'while' è la fine del nostro resultset, che assegnerà un valore 'false' alla variabile $row che, a sua volta, fungendo da variabile di controllo per il ciclo while, ne causerà l'interruzione. Siccome non esistono tabelle infinite ma, nel peggiore dei casi, tabelle molto grandi, possiamo essere più che sicuri che un ciclo strutturato in questo modo avrà di sicuro una condizione d'uscita.
Se non poniamo attenzione a questo genere di cose potremmo creare algoritmi iterativi dove ci sono cicli che non hanno condizioni d'uscita, oppure dove le condizioni d'uscita ci sono ma non si verificano mai, e che quindi innescano una situazione chiamata in gergo 'loop infinito', cioè un programma destinato inesorabilmente ad 'impallare' la macchina che lo esegue o, nel migliore dei casi, andare in timeout dopo un certo lasso di tempo.
Conclusioni ed approfondimenti:
Adesso che sappiamo come leggere una tabella intera attraverso le funzioni PHP, possiamo approfondire vari aspetti relativi alle clausole delle SELECT MySQL, funzioni di raggruppamento, ordinamento, ecc..
Più in generale, possiamo allenarci a filtrare i risultati della nostra tabella in base a determinati parametri che scriveremo nella query stessa con l'istruzione WHERE (ma più avanti vedremo come rendere dinamici anche questi parametri), ordinare in base a criteri specifici, contare quanti record soddisfano una determinata condizione e raggrupparli visualizzando quindi dei dati 'aggregati', e tante altre cose...
Nello specifico, consiglierei di applicare le funzioni MySQL come COUNT(), SUM(), MIN(), MAX(), AVG() alla nostra SELECT in base a determinati criteri insieme anche alle clausole WHERE, GROUP BY, ORDER BY e LIMIT.
Faccio qualche esempio: se volessi conoscere il livello massimo degli impiegati nella mia tabella dovrei eseguire la seguente query: SELECT MAX(livello) AS livello_massimo FROM impiegati; ottenendo quindi un solo record che riporta il livello massimo trovato nella tabella.
Se volessi leggere la tabella impiegati ordinando dal livello più alto a quello più basso, la mia query sarebbe la seguente: SELECT * FROM impiegati ORDER BY livello desc;
Volendo limitare il numero di record da leggere, ci viene in aiuto la clausola LIMIT che possiamo utilizzare in questo modo: SELECT * FROM impiegati ORDER BY livello desc LIMI 0,2;
Con questa clausola abbiamo detto a MySQL di leggere solo 2 righe, partendo dalla prima (riga zero)
Consiglio vivamente di provare e di analizzare in dettaglio le varie possibilità che il comando SELECT ci offre prima di continuare con la lezione successiva. Avremo modo di accorgerci più avanti che la padronanza delle SELECT ci darà molto vantaggio anche per i comandi che analizzeremo nelle prossime lezioni.
Alla prossima lezione con le UPDATE!
- Scarica l'esempio mysql_fetch_array.zip
Condividi su:
Esprimi un voto:
Argomenti chiave:

MySQL Report un tool di shell per tenere tutto sotto controllo