Informazioni sui campi

Gli argomenti di questa pagina

  • Prima di iniziare
  • Elenco dei campi di una tabella
  • Elenco e numero dei campi da una Query con la funzione mysql_field_name() e mysql_num_fields()
  • Struttura tabella con SHOW COLUMNS o con DESCRIBE
  • Struttura tabella con mysql_fetch_field
  • Informazioni su Query con EXPLAIN

Prima di iniziare

Innanzitutto verificare che esista il file che contiene i dati di connessione al DB.
In questo file verranno indicate le sole quattro variabili necessarie a stabilire la connessione al DB prima di compiere qualsiasi azione ed è questo file che includeremo in tutte le pagine che debbono lavorare col DB. Questi dati vengono forniti dall'host che abbiamo scelto per il nostro sito.

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

Questo che segue è un frammento di codice che sarà necesario per eseguire la connessione al DB ed alla esecuzione delle Query.

Questo frammento di codice va inserito nella pagina che deve eseguire operazioni col DB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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"); 
        
//    esecuzione della Query
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            echo 
"Query eseguita<br />\n";
            
//    qui vengono eseguiti altri eventuali lavori
        
}
    }
}
@
mysql_close ($Link);
?>

Se si apre una connessione a MySQL all'interno del file PHP è possibile chiuderla con la funzione mysql_close(). Anche se non tutti i programmatori usano chiudere esplicitamente la connessione perchè lo trovano inutile, in quanto le connessioni MySQL sono solitamente chiuse per default alla fine dello script, è buona norma fare in modo che tutte le risorse vengano liberate dopo l'utilizzo del DB, usando la funzione mysql_close(). Ciò assicurerà che la connessione venga chiusa nella linea esatta nello script in cui si dice di chiudere.

Chiusura della connessione al DB
1
2
3
<?php
mysql_close 
($link);
?> 

Elenco dei campi di una tabella

Ottenere l'elenco dei campi di una tabella è semplice ed è possibile usare due clausole differenti:
SHOW COLUMNS
DESCRIBE
Entrambe restituiscono lo stesso risultato. Per estrarre i nomi dei campi, quando si scorre il resultset restituito dalla query è sufficiente estrarre il primo elemento individuato tramite l'indice 0 (zero).
In realtà la Query qui sotto mostrata restituisce molte altre proprietà dei campi della tabella:
Field, Type, Null, Key, Default, Extra
Per questo nello script qui in basso viene estratto solo l'elemento con indice 0 (zero).

Le due Query per leggere le colonne

1
2
3
4
5
<?php
$Query1 
"DESCRIBE sql_rubrica";
//    OPPURE
$Query2 "SHOW COLUMNS FROM sql_rubrica";
?>

L'esecuzione delle due Query

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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");
        
$fields = array();
        
$result mysql_query($Query);
        
$count_propriety mysql_num_rows($result);
        while(
$row mysql_fetch_array($result)) {
            
$fields[] = $row[0];
        }
        echo 
implode(", "$fields) . "<br />\n";
    }
}
@
mysql_close ($Link); 
?>

Ecco cosa si ottiene eseguendo una delle due Query

id, codice, cognome, nome, indirizzo, cap, citta, prov, data_nascita, telefono

Elenco e numero dei campi da una Query con la funzione mysql_field_name() e mysql_num_fields()

Con la funzione SHOW COLUMNS vengono estratti tutti i campi di una tabella MYSQL.
Con la funzione mysql_field_name() possiamo estrarre i campi coinvolti da una Query SELECT.
La sintassi è semplice.

mysql_field_name ( resultset, indice )

La funzione mysql_field_name() il nome del campo indicato da un indice. Per avere l'elenco dei campi coinvolti in una Query, occorre eseguire la Query con
$result = mysql_query($Query)
Poi possiamo agire sul resultset memorizzato nella variabile $result prima per conoscere il numero di campi letti con
$numfields  = mysql_num_fields($result)
Poi con un ciclo basato sul numero di record possiamo leggere i nomi dei campi con
$field = mysql_field_name($result, $i)
Qui sotto vediamo come queste due funzioni di comportano don due differenti Query.

1
2
3
4
<?php
$Query1 
"SELECT * FROM sql_citta";
$Query2 "SELECT citta, prov FROM sql_citta";
?>

Questi sono i risultati ottenuti con le due differenti 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
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName$link)) {
    echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n"
        } else {
            
$numfields mysql_num_fields($result);
            echo 
$numfields " campi restituiti dalla Query " $Query "<br />\n";
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            echo 
implode(", " $fields) . "<br />\n";
        }
    }
}
mysql_close ($link);
?>

Questi sono i risultati ottenuti con le due differenti Query

4 campi restituiti dalla Query SELECT * FROM sql_citta
id, cap, citta, prov
2 campi restituiti dalla Query SELECT citta, prov FROM sql_citta
citta, prov

Come è stato detto qui sopra, la Query SHOW COLUMNS, oltre all'elenco dei campi di una tabella, restituisce anche altre informazioni sui campi della tabella. Queste informazioni le possiamo ottenerle con due istruzioni equivalenti.

Struttura tabella con SHOW COLUMNS o con DESCRIBE

SHOW COLUMNS e l'altra istruzione simile DESCRIBE visualizzano informazioni sulle colonne di una tabella. L'istruzione MYSQL SHOW COLUMNS viene utilizzato per visualizzare tutte le colonne di una tabella e tutti i loro dettagli. I dettagli che possiamo esaminare sono Field, Type, Null, Key, Default, Extra
Con questa Query viene mostrato un elenco di tutte le colonne (campi) della tabella sql_rubrica, insieme a tutte le altre informazioni.

1
2
3
4
5
<?php
$Query1 
"DESCRIBE sql_rubrica";
//    OPPURE
$Query2 "SHOW COLUMNS FROM sql_rubrica";
?>

Questo è lo script usato per esporre le tabelle e le informazioni che la riguardano.

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
<?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");
        
$fields = array();
        if (
$result mysql_query($Query)) {
            
$rows mysql_fetch_assoc($result);
            
mysql_data_seek($result0);
            
$fields array_keys($rows);
            
//    Field
            
$fields_name = array();
            
            echo 
"<table class=\"tabella_it\">\n";
            echo 
"<tr>\n";
            for (
$i 0$i count ($fields); $i++) {
                echo 
"<th>" $fields[$i] . "</th>\n";
            }
            echo 
"</tr>\n";
            while(
$row mysql_fetch_array($result)) {
                echo 
"<tr>\n";
                for (
$i 0$i count ($fields); $i++) {
                    echo 
"<td>" $row[$fields[$i]] . "</td>\n";
                }
                echo 
"</tr>\n";
                
$fields_name[] = $row['Field'];
            }
            echo 
"</table>\n";
            echo 
"I campi della tabella " $table ":<br />" implode(", "$fields_name);
        } else {
            echo 
mysql_error() . "<br />\n";
        }
    }
}
@
mysql_close ($Link);
?>

I risultati che ci mostra lo script.

Field Type Null Key Default Extra
id int NO PRI auto_increment
codice varchar(50) NO
cognome varchar(250) NO
nome varchar(250) NO
indirizzo varchar(250) NO
cap varchar(250) NO
citta varchar(250) NO
prov varchar(10) NO
data_nascita date NO
telefono varchar(250) NO
I campi della tabella :
id, codice, cognome, nome, indirizzo, cap, citta, prov, data_nascita, telefono

Struttura tabella con mysql_fetch_field

La funzione mysql_fetch_field() può essere usata per ottenere informazioni circa i campi restituiti in un resultset dall'esecuzione di una Query.
Questa funzione restituisce un oggetto contenente le informazioni sui campi del resultset. Il mysql_fetch_field () la funzione ottiene i dati dalla funzione mysql_query () e restituisce un oggetto di successo, FALSE in caso di fallimento.
Questo mysql_fetch_field () la funzione riceve informazioni sulla colonna da un risultato della query e restituisce come oggetto.
Restituisce un oggetto, usando che possiamo ottenere le informazioni necessarie sul campo.

Lo script si basa su questa Query:

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

Questo script ha una struttura che si scosta leggermente da quelli generalmente usati.
In questo script ho voluto mostrare due differenti ma equivalenti cicli while per iterare sulle varie righe del resultset, ma uno solo può essere utilizzato. In questo script ho optato per il primo
Nel primo ciclo while, che restituisce un record per ogni iterazione sul resultset, estraggo i vari valori basandomi sui nomi dei campi ($fields)
Per visualizzare i singoli valori viene usato il ciclo FOR sull'Array $fields per poter usare il costrutto $row->$fields[$i] anzichè $row[$fields[$i]] perchè non si può utilizzare un oggetto di tipo stdClass come matrice, come reciterebbe il messaggio di errore che questa ultima sintassi causerebbe:
"Fatal error: Cannot use object of type stdClass as array in percorso\nome_file.php on line xx".
Nel secondo ciclo while faccio uso del ciclo foreach per iterare sull'array associativo con le proprietà dell'oggetto usando la funzione get_object_vars. La funzione get_object_vars restituisce un array associativo con le proprietà dell'oggetto contenuto nella variabile $row.

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
<?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);
        
$row mysql_fetch_field ($result);
        
$fields = array();
        foreach (
get_object_vars ($row) as $key => $value) {
            
$fields[] = $key;
        }
        
mysql_field_seek($result0);
        echo 
"<table class=\"tabella_it\">\n";
        echo 
"<tr>\n";
        for (
$i 0$i count ($fields); $i++) {
            echo 
"<th>" $fields[$i] . "</th>\n";
        }
        echo 
"</tr>\n";
        
        
//    =========================================================
        
while ($row mysql_fetch_field($result)) {
            echo 
"<tr>\n";
            for (
$i 0$i count ($fields); $i++) {
                echo 
"<td>" $row->$fields[$i] . "</td>\n";
            }
            echo 
"</tr>\n";
        }
        
//    =========================================================
        /*
        while ($row = mysql_fetch_field ($result)) {
            echo "<tr>\n";
            foreach (get_object_vars ($row) as $value) {
                    echo "<td>" . $value . "</td>\n";
            }
            echo "</tr>\n";
        }
        */
        
echo "</table>\n";
    }
}
@
mysql_close ($Link);
?>

Queste che seguono sono le informazioni che otteniamo sulla tabella ;

name table def max_length not_null primary_key multiple_key unique_key numeric blob type unsigned zerofill
id sql_citta 3 1 1 0 0 1 0 int 0 0
cap sql_citta 5 0 0 0 0 0 0 string 0 0
citta sql_citta 22 0 0 0 0 0 0 string 0 0
prov sql_citta 2 0 0 0 0 0 0 string 0 0

Informazioni su Query con EXPLAIN

L'istruzione EXPLAIN può restituire anche informazioni per ogni tabella coinvolta in una Query ed è quindi utile per ottimizzare le Query usate.
L'istruzione EXPLAIN può aiutare a riscrivere meglio le query o modificare le tabelle in modo tale che il server risolva il join nel modo meno oneroso possibile, riducendo il numero di combinazioni da esaminare. Certo le Query presentate in questo esempio sono semplici, quindi in questo caso si evidenzia poco la sua utilità.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$Query1 
"EXPLAIN SELECT * FROM sql_citta";

$Query2 "EXPLAIN SELECT * FROM sql_citta WHERE prov = 'LC'";

$Query3 "EXPLAIN SELECT 
    MIN(prezzo) AS min_prezzo,
    MAX(prezzo) AS max_prezzo
    FROM sql_libri
    WHERE prezzo > 50
    ORDER BY max_prezzo"
;
    
$Query4 "EXPLAIN (SELECT id, cognome, nome, indirizzo 
    FROM sql_rubrica)
    UNION ALL 
    (SELECT id, cognome, nome, indirizzo 
    FROM sql_agenda) "

?>

Questo è il solito script per eseguire le 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
<?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)) {
            
$rows mysql_fetch_assoc($result);
            
$fields array_keys($rows);
            
mysql_data_seek($result0);
            echo 
"<table class=\"tabella_it\">\n";
            echo 
"<tr>\n";
            for (
$i 0$i count ($fields); $i++) {
                echo 
"<th>" $fields[$i] . "</th>\n";
            }
            echo 
"</tr>\n";
            while (
$row mysql_fetch_assoc($result)) {
                echo 
"<tr>\n";
                for (
$i 0$i count ($fields); $i++) {
                    echo 
"<td>" $row[$fields[$i]] . "</td>\n";
                }
                echo 
"</tr>\n";
            }
            echo 
"</table>\n";
        } else {
            echo 
mysql_error() . "<br />\n";
        }
    }

@
mysql_close ($Link);
?>

Con la prima Query si ottiene:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE sql_citta ALL 38 100.00

Con la seconda Query si ottiene:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE sql_citta ALL 38 10.00 Using where

Con la terza Query si ottiene:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE sql_libri ALL 22 33.33 Using where

Con la quarta Query si ottiene:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY sql_rubrica ALL 101 100.00
2 UNION sql_agenda ALL 103 100.00

 

 



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