Esecuzione Visualizzare di una Query
Gli argomenti di questa pagina
|
Prima di partire coi vari metodi usati per creare una Query SELECT mostrerò in questa pagina come fare per eseguire una query e per visualizzare il relativo resultset. Poichè, sostanzialmente, per eseguire la Query e mostrarne il resultset generato gli script sono molto simili, il metodo lo mostro qui in questa pagina. In questo modo nelle successive pagine possiamo concentrarci sulle sole Query ed eventuali risultati senza dilungarci su come mostrare i dati.
I metodi per leggere e visualizzare i recordset restituiti dalle Query SELECT presentati in questa pagina, per motivi di spazio, non verranno presentati nelle pagine successive se non in casi particolari.
Il file db_login.php
Innanzitutto occorre essere in possesso dei dati di accesso al DB.
Questi dati debbono essere disponibili in ogni script che dovrà accedere al DB, quindi o vanno scritti in ogni singola pagina o vengono scritti in un file esterno e messo in una cartella separata accessibile da tutte le pagine e richiamato prima di iniziare lo script per la gestione del DB con un include().
Questa tecnica ha alcuni vantaggi:
- non è necessario scrivere i dati in ogni singola pagina
- se occorre cambiare alcuni dei dati di accesso (una password o un DB cambiati) è sufficiente cambiarli una sola volta
- si evitano errori di digitazione e se questi avvengono è più facile individuarli
Io di solito metto il file in una cartella chiamata res e lo chiamo db_login.php.
Questo è il file db_login.php.
1
|
<?php
|
Tipi di Query
Come indicato nella pagina introduttiva, ribadisco che ci sono alcuni tipi fondamentali di Query
- Query di lettura
- Query di scrittura
- Query di modifica
- Query di eliminazione
In questo settore dedicato alle SELECT ci occuperemo delle Query di lettura. Delle altre Query ci occuperemo nei rispettivi settori. Ma prima è doveroso presentare una funzione comune a tutti i tipi di lettura.
Funzione di fetch per estrarre i dati
Per estrarre i record dal Resultset si possono usare alcune funzioni MYSQL tra cui le più comuni sono le tre qui sotto elencate:
- mysql_fetch_array - Carica una riga del risultato come un array associativo, un array numerico o entrambi
- mysql_fetch_assoc - Carica una riga del risultato come un array associativo.
- mysql_fetch_row - Carica una riga del risultato come un array numerico
La funzione mysql_fetch_array() ha un secondo parametro facoltativo che le fa cambiare il suo comportamento rendendola simile alle altre due funzioni.
Se il secondo parametro è omesso viene assunto come default MYSQL_BOTH che è il suo comportamento normale.
- MYSQL_ASSOC: restituisce un recordset di risultati in un array associativo. Equivalente a mysql_fetch_assoc()
mysql_fetch_array($result , MYSQL_ASSOC) - MYSQL_NUM: restituisce un recordset di risultati in un array con indici numerici - Equivalente a mysql_fetch_row()
mysql_fetch_array($result, MYSQL_NUM) - MYSQL_BOTH: restituisce un recordset di risultati in un array con indici numerici e associativi
mysql_fetch_array($result, MYSQL_BOTH)
Qui sotto ci sono degli esempi delle varie matrici generate dalle tre funzioni MYSQL. Per ciascuna è mostrato un esempio.
Nelle tre tabelline di esempio visibili sotto i rispettivi frammenti di codice vediamo nella prima colonna gli indici creati dai differenti "fetch" e a destra i relativi valori associati a questi indici.
Con mysql_fetch_array | Con mysql_fetch_assoc | Con mysql_fetch_row | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
Creata una Query è possibile estrarre dal resultset ottenuto alcune informazioni utili.
In questo, e negli altri script, una volta ottenuto il resultset ($result = mysql_query($Query);), é possibile leggere:
il numero dei campi implicati nella Query: $numfields = mysql_num_fields($result);
l nomi dei campi implicati nella Query vengono letti usando il ciclo FOR con l'istruzione mysql_field_name($result, $i);
il numero delle righe restituite dalla Query con: $num_row = mysql_num_rows($result);
i record che vengono estratti con un altro ciclo while usando uno dei tre
"fetch": while ($row = mysql_fetch_array($result))
Tutte queste letture vengono eseguite sul resultset che negli esempi vengono rappresentati dalla variabile $result.
Le Query di lettura
Qui ci interessiamo delle Query di lettura quindi della istruzione SELECT. Degli altri tipi di Query ne parleremo in altra sede.
Normalmente una Query restituisce un insieme di righe e di colonne, ma volendo fare delle distinzioni, possiamo dire che esse possono essere distinte in:
- Query di tabelle: è una Query SELECT che restituisce più righe e una o più colonne.
- Query di righe: è una Query una sola colonna ed una o più righe.
- Query scalare: è una Query SELECT che restituisce esattamente una riga con una colonna.
- Query monoriga e più colonne: è una Query SELECT simile a quella scalare ma che restituisce una unica riga e più colonne
Nulla distingue la creazione di ciscuna di queste Query se non il progetto concettuale di ciò che si vuole ottenere. Per ognuno di questo tipo cercherò di presentare un particolare tipo di script ottimizzato per ciscuno di questi tipi di Query.
Query di tabelle e di righe
Queste due Query sono simili tra loro con la sola differenza che la prima produce un resulset, una tabella virtuale, con più righe e più colonne, mentre la seconda produce un recordset con più righe ed una sola colonna.
Il recordset è
assimilabile ad una tabella reale ma che non è fisicamente memorizzata nel DB.
Per entrambe le metodologie un probabile script da usare con queste Query potrebbe essere il seguente che organizza e mostra i dati prelevati in forma tabellare. Per leggere tutte le righe restituite dalla Query, normalmente viene usato il ciclo while che cicla sull'array memorizzato in $result contenente i record e, grazie ai campi letti precedentemente, con un ciclo FOR il record corrente viene ciclato sui suoi campi, siano questi molteplici che unici.
1
|
<?php
|
Questi che seguono sono due esempi di output creati da questo script
Esempio di resultset con Query di tabelle | Esempio di resultset con Query di righe | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 record trovati 8 record visualizzati
|
18 record trovati 15 record visualizzati
|
Query scalare
La query scalare restituisce una sola colonna e, tramite un filtro o una funzione di riepilogo, limita a non più di una riga.
Per leggere il resultset restituito da questo tipo di Query, lo script è molto semplificato.
1
|
<?php
|
Vediamo subito una Query di esempio capace di restituirci un recordset scalare
1
|
<?php
|
Questo è un esempio di output generato dalla Query usata con questo script
Query monoriga con più colonne
Non è inusuale trovarci di fronte ad una Query che restituisce una sola riga ma non necessariamente una sola colonna. Per ottenere questo tipo di resultset spesso è necessario ricorrere a filtri appositamente studiati come visto per la creazione di una Query scalare.
Per questo tipo di Query è possibile usare questo script che, contrariamente a quanto visto nel primo esempio, non ha bisogno di ciclare sul recordset ma preleva subito l'unico record memorizzato nel resultset:
$row = mysql_fetch_array($result);
1
|
<?php
|
Questo è un esempio di Query. Al posto dell'asterisco è possibile specificare i nomi di alcuni campi.
1
|
<?php
|
Questo è un esempio di output creato da questo script
id | cap | citta | prov |
---|---|---|---|
13 | 20050 | Correzzana | MB |
Qui di seguito alcuni script utili fin da subito per qualsiasi tipo di Query SELECT.
Recuperare manualmente le righe restituite da Query: mysql_fetch_array
Tra i metodi visti sopra la mia preferita è senz'altro la mysql_fetch_array per il fatto che restituisce un particolare array con due indici: uno numerico ed uno associativo.
Per ottenere questa matrice e poi stamparla nel Browser, possiamo leggere il Recordset usando uno dei due esempi.
1
|
<?php
|
Resettare il puntatore di riga in un resultset: mysql_data_seek()
La funzione mysql_data_seek () sposta il puntatore interno di un resultset.
La funzione mysql_data_seek () viene utilizzata per spostare il puntatore interno del resultset restituito da mysql_query () su una riga specifica. Consente di accedere in modo arbitrario ai risultati di una Query di ricerca (o per muovere) il puntatore del record interno del resultset. Il punto iniziale della posizione di un puntatore normalmente parte da '0' (zero), se si specifica un altro valore, per esempio '5', il puntatore viene spostato alla quinta riga del resultset restituendo le successive righe a partire dalla quinta posizione.
Eseguita la Query viene restituito un resultset col puntatore che viene inizializzato a '0'. Normalmente viene eseguito un ciclo WHILE che iterando sul resultset sposta il puntatore alla posizione successiva per restituire sempre nuovi record fino a raggiungere la fine del resultset. Alla fine del ciclo il puntatore si trova alla fine del resultset. Per riprendere una nuova iterazione sul resultset occorre spostare il puntatore nella posizione desiderata (normalmente nella posizione '0') usando la funzione funzione mysql_data_seek () con l'istruzione:
mysql_data_seek($result, 0); spostando così il puntatore alla posizione '0'.
La sintassi della funzione mysql_data_seek è quella che segue
result: Richiesto. Consente di specificare quale puntatore di dati da utilizzare. Il puntatore dei dati è il risultato dalla funzione mysql_query ()
num_row: Richiesto. Specifica a quale record spostarsi. 0 indica il primo record
Qui sotto viene mostrato un frammento di codice che mostra in modo molto sintetico come usare un costrutto che fa uso della funzione mysql_data_seek().
Dopo l'esecuzione della Query con mysql_query() viene istruito un ciclo basato su while.
Finito il ciclo, prima di iniziare il secondo viene usata la funzione mysql_data_seek() come mostrato nell'esempio.
Quindi viene usato ancora il ciclo while o altro metodo dettato dalle esigenze del momento.
Il codice omesso in questo frammento di codice è simile a quello standard visto in precedenza.
1
|
<?php
|
Questo potrebbe essere un esempio dello script.
Una normale Query
1
|
<?php
|
Lo script che espone due volte il recordset restituito dalla Query:
1
|
<?php
|
Qui di seguito il risultato ottenuto ciclando due volte sul resultset:
la prima volta nella tabella a sinistra e la seconda volta nella tabella a destra.
Dopo aver visualizzato i dati nella tabella di sinistra e prima di visualizzare i dati nella tabella di destra viene usata la funzione mysql_data_seek(),
Prima iterazione su 38 record del resultset
|
Seconda iterazione su 38 record del resultset dopo il mysql_data_seek
|