Home
  • Php
  • PHP MySQL Tutorial di base - Lezione 9 - mysql_fetch_array
re-verse
pubblicato circa un anno fa

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:

1$result = mysql_query("SELECT * FROM impiegati")
2or die(mysql_error());

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:

  • Current rating: 5.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Argomenti chiave:

Ultimi commenti Ultimi commenti

Esegui il Login oppure registrati per scrivere un commento.
Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic