Esecuzione Visualizzare di una Query

Gli argomenti di questa pagina

  • Il file db_login.php
  • Tipi di Query
  • Funzione di fetch per estrarre i dati
  • Le Query di lettura
  • Query di tabelle e di righe
  • Query scalare
  • Query monoriga con più colonne
  • Recuperare manualmente le righe restituite da Query: mysql_fetch_array
  • Resettare il puntatore di riga in un resultset: mysql_data_seek()

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.

include ('res/db_login.php');

Questo è il file db_login.php.

1
2
3
4
5
6
<?php
$Host 
"hostname";
$User "username";
$Password "password";
$DBName "DBName";
?>

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
1
2
3
4
5
6
7
8
9
<?php
$result 
mysql_query($Query);
//    SE SI SUPPONE DI OTTENERE UNA SOLA RIGA
$row mysql_fetch_array($result);
//    SE SI SUPPONE DI OTTENERE PIU' RIGHE
while ($row mysql_fetch_array($result)) {
//    ...........
}
?>
1
2
3
4
5
6
7
8
9
<?php
$result 
mysql_query($Query);
//    SE SI SUPPONE DI OTTENERE UNA SOLA RIGA
$row mysql_fetch_assoc($result);
//    SE SI SUPPONE DI OTTENERE PIU' RIGHE
while ($row mysql_fetch_assoc($result)) {
//    ...........
}
?>
1
2
3
4
5
6
7
8
9
<?php
$result 
mysql_query($Query);
//    SE SI SUPPONE DI OTTENERE UNA SOLA RIGA
$row mysql_fetch_row($result);
//    SE SI SUPPONE DI OTTENERE PIU' RIGHE
while ($row mysql_fetch_row($result)) {
//    ...........
}
?>
01
id1
135031
cap35031
2AbanoTerme
cittaAbanoTerme
3PD
provPD
id1
cap35031
cittaAbanoTerme
provPD
01
135031
2AbanoTerme
3PD

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        if (
$result mysql_query($Query)) {
            
$num_row mysql_num_rows($result);
            
$numfields mysql_num_fields($result);
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            if (
$num_row 0) {
                echo 
$num_row " record letti<br />\n";
                echo 
"<table class=\"tabella_it\">\n";        
                echo 
"<tr>\n";
                for (
$i=0$i $numfields$i++) {
                    echo 
"<th>" $fields[$i] . "</th>\n";
                }
                echo 
"</tr>\n";
                while (
$row mysql_fetch_array($result)) {
                    echo 
"<tr>\n";
                    for (
$i=0$i $numfields$i++) {
                        echo 
"<td>";
                        echo 
is_null($row[$fields[$i]]) ? 'NULL' $row[$fields[$i]];
                        echo 
"</td>\n";
                    }
                    echo 
"</tr>\n";
                }
                echo 
"</table>\n";
            } else {
                echo 
"Nessun record restituito<br />\n";
            }
        } else {
            echo 
mysql_error() . "<br />\n"
        }
    }
}
mysql_close ($link);

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
1
2
3
4
5
6
<?php
$Query 
"SELECT cognome, nome, citta, prov, cap
FROM sql_rubrica
WHERE nome = 'Andrea'
OR nome = 'Emilio'"
;
?>
1
2
3
4
<?php
$Query 
"SELECT DISTINCT citta
FROM sql_rubrica"
;
?>
8 record trovati
8 record visualizzati
cognome nome citta prov cap
Scicchitano Andrea Ville di Fano RF 51021
Boscati Andrea Ville di Fano RF 51021
Dionisio Andrea San Leonardo in Passiria RF 51023
Broccardo Andrea Abbadia Lariana AB 67030
Bianchi Emilio Castel Vittorio CH 89844
Valsaca Emilio Condofuri RO 85022
Torricelli Andrea Giusvalla CA 26020
Forlini Andrea Giusvalla CA 26020
18 record trovati
15 record visualizzati
citta
Varena
Abbadia Lariana
Ville di Fano
Correzzana
Marsiliana
Falconara Alta
Borgo S. Dalmazzo
San Leonardo in Passiria
Cereseto
Coccanile
AbanoTerme
Bevagna
Castel Vittorio
Condofuri
Corinzio
...

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$result mysql_query($Query);
        
$num_row mysql_num_rows($result);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            
$field mysql_field_name($result0);
            
$row mysql_fetch_array($result);
            echo 
"Restituisce => ";
            echo 
$field ": " $row[$field] . "<br />\n";
        }
    }
}
mysql_close ($link);
?>

Vediamo subito una Query di esempio capace di restituirci un recordset scalare

1
2
3
4
<?php
$Query 
" SELECT AVG( prezzo ) AS media_prezzo
FROM sql_libri "
;
?>

Questo è un esempio di output generato dalla Query usata con questo script

Restituisce => media_prezzo: 238.792727

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$result mysql_query($Query);
        
$num_row mysql_num_rows($result);
        
$numfields mysql_num_fields($result);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            
$row mysql_fetch_array($result);
            echo 
$num_row " record restituiti<br />\n";
            echo 
"<table class=\"tabella_it\">";
            echo 
"<tr>\n";
            for (
$i=0$i $numfields$i++) {
                echo 
"<th>" $fields[$i] . "</th>\n";
            }
            echo 
"</tr>\n";
            echo 
"<tr>\n";
            for (
$i=0$i $numfields$i++) {
                echo 
"<td>" $row[$fields[$i]] . "</td>\n";
            }
            echo 
"</tr>\n";
            echo 
"</table>\n";
        }
    }
}
mysql_close ($link);
?>

Questo è un esempio di Query. Al posto dell'asterisco è possibile specificare i nomi di alcuni campi.

1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE id =13"
;
?>

Questo è un esempio di output creato da questo script

1 record restituiti
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
    echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$Query "SELECT * FROM sql_citta";
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n"
        } else {
            echo 
"<table class=\"tabella_it\">\n";
            echo 
"<tr>\n";
            echo 
"<th>id</th>\n";
            echo 
"<th>cap</th>\n";
            echo 
"<th>citta</th>\n";
            echo 
"<th>prov</th>\n";
            echo 
"</tr>\n";
            while (
$row mysql_fetch_array($result)) {
                echo 
"<tr>\n";
                echo 
"<td>" $row['id'] . "</td>\n";
                echo 
"<td>" $row['cap'] . "</td>\n";
                echo 
"<td>" $row['citta'] . "</td>\n";
                echo 
"<td>" $row['prov'] . "</td>\n";
                echo 
"</tr>\n";
            }
            echo 
"</table>\n";
        }
    }
}
mysql_close ($link);
?>

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

mysql_data_seek(result, num_row)
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
2
3
4
5
6
7
8
9
10
<?php
$result 
mysql_query($Query);
while (
$row mysql_fetch_array($result)) {
    
//    prima visualizzazione record
}
mysql_data_seek($result0);
while (
$row mysql_fetch_array($result)) {
    
//    ulteriore visualizzazione record
}
?>

Questo potrebbe essere un esempio dello script.
Una normale Query

1
2
3
4
<?php
$Query 
"SELECT *
FROM sql_citta"
;
?>

Lo script che espone due volte il recordset restituito dalla Query:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n"
        } else {
            
$num_row mysql_num_rows($result);
            
$numfields mysql_num_fields($result);
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            echo 
"<table>\n";
            echo 
"<tr>\n";            
            echo 
"<td>\n";
                echo 
"Prima iterazione su " $num_row " record del resultset";
                echo 
"<table class=\"tabella_it\">\n";
                echo 
"<tr>\n";
                for (
$i=0$i $numfields$i++) {
                    echo 
"<th>" $fields[$i] . "</th>\n";
                }
                echo 
"</tr>\n";
                while (
$row mysql_fetch_array($result)) {
                    echo 
"<tr>\n";
                    for (
$i=0$i $numfields$i++) {
                        echo 
"<td>" $row[$fields[$i]] . "</td>\n";
                    }
                    echo 
"</tr>\n";
                }
                echo 
"</table>\n";
            echo 
"</td>\n";
            echo 
"<td>\n";
            
mysql_data_seek($result0);
                echo 
"Seconda iterazione su " $num_row " record del resultset dopo il mysql_data_seek";
                echo 
"<table class=\"tabella_it\">\n";
                echo 
"<tr>\n";
                echo 
"<th>citta</th>\n";
                echo 
"<th>prov</th>\n";
                echo 
"</tr>\n";
                while (
$row mysql_fetch_array($result)) {
                    echo 
"<tr>\n";
                    echo 
"<td>" $row['citta'] . "</td>\n";
                    echo 
"<td>" $row['prov'] . "</td>\n";
                    echo 
"</tr>\n";
                }            
                echo 
"</table>\n";
            echo 
"</td>\n";
            echo 
"</tr>\n";
            echo 
"</table>\n";
        }
    }
}
mysql_close ($link);
?>

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
id cap citta prov
1 35031 AbanoTerme PD
2 23821 Abbadia Lariana LC
3 56011 Agropoli GH
5 06031 Bevagna PG
6 12011 Borgo S. Dalmazzo CN
7 18037 Castel Vittorio IM
8 43050 Cereseto PR
9 44030 Coccanile FE
10 89030 Condofuri RC
12 60013 Corinaldo AN
13 20050 Correzzana MB
14 60015 Falconara Alta AN
15 17010 Giusvalla SV
18 58010 Marsiliana GR
19 55060 Massarosa LU
20 39013 Moso in passiria BZ
21 38030 Varena TN
22 67010 Ville di Fano AQ
23 56017 Agnano PI
24 80125 Agnano NA
25 36078 Castelvecchio VI
27 67020 Castelvecchio calvisio AQ
28 21030 Cuvio VA
29 21020 Daverio VA
30 80070 Fusaro NA
31 80075 Monterone NA
32 02011 Accumoli RI
33 31037 Loria TV
34 98031 Capizzi ME
36 95040 Borgo lupo CT
37 89020 Melicucco RC
38 22010 Dosso del liro CO
39 81010 Gallo matese CE
40 12040 Isola di bene vagienna CN
41 33020 Ligosullo UD
42 30126 Malamocco VE
43 40059 Medicina BO
162 29010 Godi PC
Seconda iterazione su 38 record del resultset dopo il mysql_data_seek
citta prov
AbanoTerme PD
Abbadia Lariana LC
Agropoli GH
Bevagna PG
Borgo S. Dalmazzo CN
Castel Vittorio IM
Cereseto PR
Coccanile FE
Condofuri RC
Corinaldo AN
Correzzana MB
Falconara Alta AN
Giusvalla SV
Marsiliana GR
Massarosa LU
Moso in passiria BZ
Varena TN
Ville di Fano AQ
Agnano PI
Agnano NA
Castelvecchio VI
Castelvecchio calvisio AQ
Cuvio VA
Daverio VA
Fusaro NA
Monterone NA
Accumoli RI
Loria TV
Capizzi ME
Borgo lupo CT
Melicucco RC
Dosso del liro CO
Gallo matese CE
Isola di bene vagienna CN
Ligosullo UD
Malamocco VE
Medicina BO
Godi PC

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum