LORETTA B. forum

Linguaggi di programmazione => Php e MySql (data base) => Topic aperto da: micdas - Dicembre 11, 2010, 22:28:43

Titolo: -6- Gestione completa (o quasi) del DB: Elenco delle tabelle
Inserito da: micdas - Dicembre 11, 2010, 22:28:43
Ottenere l'elenco delle tabelle dal DB
Questa potrebbe sembrare una pagina di scarsa utilità.
Tuttavia non è così. Ogni tanto occorre avere un elenco completo delle tabelle, dei relativi campi, del numero dei record ivi inseriti. Potremmo anche avere la necessità di vedere la tipologia dei singoli campi, Ma questo lo vedremo in una pagina differente altrimenti dovremmo cambiare impostazione alla pagina per non avere confusione nell'outpu delle informazioni.

Questo è il contenuto del file show_tables.php:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Gestione cerca</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<link href="css/stile.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="container">
<div id="header">
<h1>&nbsp;</h1>
</div>
<div id="navigation">&nbsp;</div>
    <div id="content">
<h1>Elenco della tabelle presenti nel DB</h1>
<?php
include ("res/config_db.php");
include (
"res/functions.php");
$Query "SHOW TABLES FROM $DBName";
$all_tables show_tables($Query);
$num_tab count($all_tables);
if (
$num_tab != 0) {
echo "<h2>" $num_tab " tabelle presenti nel DB in uso</h2>\n";
echo "<div  align=\"center\">\n";
echo "<table class=\"table_1\">\n";
echo "<tr>\n";
echo "<th>Nome tabella</th>\n";
echo "<th>N. campi</th>\n";
echo "<th>campi</th>\n";
echo "<th>N. record</th>\n";
echo "</tr>\n";
for ($i 0$i count($all_tables); $i++) {
echo "<tr>\n";
$Query "SELECT * FROM ".$all_tables[$i];
$num_rec num_record($Query);
$fields mostra_campi($all_tables[$i]);
echo "<td>" $all_tables[$i] . "</td>\n";
echo "<td>" count($fields) . "</td>\n";
echo "<td>";
echo implode("<br />"$fields); 
echo "</td>\n";
echo "<td>" $num_rec "</td>\n";
echo "</tr>\n";
}
echo "</table>\n";
echo "</div>\n";
} else {
echo "Nel DB in uso non c'è alcuna tabella<br />\n";
}
?>

    </div>
<div id="footer">
<?php
include ("res/link.php");
?>

    </div>
</div>
</body>
</html>

Alcune note a questa pagina
Inclusione di due files esterni contenenti sia i dati per la connessione che altre variabili di servizio ed alcune funzioni personali che verranno utilizzate nella pagina
Codice: Non sei autorizzato a vedere i links. Registrati o Login
include ("res/config_db.php");
include ("res/functions.php");

Lettura delle tabelle contenute nel DB e rilevamento del loro numero
Per far questo istruiamo la Query usando l'istruzione MYsql SHOW TABLES
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query = "SHOW TABLES FROM $DBName";
$all_tables = show_tables($Query);
$num_tab = count($all_tables);

Quindi andiano alla mia funzione personale show_tables()
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
function show_tables($Query$pref="") {
    global 
$Host;
    global 
$User;
    global 
$Password;
    global 
$DBName;
    if (!
$link mysql_connect($Host$User$Password)) {
        return 
FALSE;
    }
    if (!
mysql_select_db($DBName$link)) {
        return 
FALSE;
    }
    
$result mysql_query($Query$link);
    if (!
$result) {
        return 
FALSE;
    } else {
        
$tab = array();
        while (
$row mysql_fetch_row($result)) {
            
$tab[] = $row[0];
        }
    }
    
mysql_close ($Link);
    return 
$tab;
}
?>


Rilevamento dei record inseriti nelle tabelle trovate
Verificata la presenza di tabelle nel DB si passa nel controllare se queste tabelle hanno dei record interrogando la mia funzione personale num_record()
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query = "SELECT * FROM ".$all_tables[$i];
$num_rec = num_record($Query);

La mia funzione:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
function num_record($query) {
    global 
$Host;
    global 
$User;
    global 
$Password;
    global 
$DBName;
    if (!
$link mysql_connect($Host$User$Password)) {
        return 
FALSE;
    }
    if (!
mysql_select_db($DBName$link)) {
        return 
FALSE;
    }
    
$result mysql_query($query$link);
    if (!
$result) {
        return 
FALSE;
    }
    
$num_rec mysql_num_rows($result);
    
mysql_close ($link);
    return 
$num_rec;
}
?>


Lettura dei campi di ciascuna delle tabelle trovate
Anche in questo caso ricorro ad una mia funzione personale per la lettura dei campi. Nella matrice $fields vengono memorizzati i campi restituiti dalla funzione
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$fields = mostra_campi($all_tables[$i]);
e questa la relativa funzione:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
function mostra_campi($tabella) {
    global 
$Host;
    global 
$User;
    global 
$Password;
    global 
$DBName;
    
$Link mysql_connect ($Host$User$Password);
    
$fields mysql_list_fields($DBName$tabella$Link);
    
$columns mysql_num_fields($fields);
    for (
$i 0$i $columns$i++) {
        
$field[] = mysql_field_name($fields$i);
    }
    
mysql_close ($Link);
    return 
$field;
}
?>


E' tutto per ora.........
Alla prossima    :ciao:
Titolo: Re:-6- Gestione completa (o quasi) del DB: Elenco delle tabelle
Inserito da: HellDevil - Dicembre 12, 2010, 12:31:15
Ciao mic  :Party133:,
giusto per completezza, dato che non ti servono tutti i record nella funzione num_record() ma solo il loro numero, anzichè fare una "select * from table" e poi usare la funzione mysql_num_rows() di php puoi fare semplicemente una count sulla select così: "select count(*) from table".
In questo modo hai due vantaggi, usi una funzione in meno (anche se la sostituiamo con la mysql_fetch_row ma sono due funzioni diverse, una solo di visualizzazione e un'altra di elaborazione dei dati) quindi minor tempo di elaborazione (che su sistemi molto lenti fa la differenza), e non carichi in memoria un recordset che potrebbe essere anche molto grande (molto spesso si lavora su tabelle con milioni di record) ma hai di ritorno un solo record con un solo valore, possiamo quindi modificare la tua funzione in questo modo:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
$Query 
"SELECT COUNT(*) FROM ".$all_tables[$i];
function 
num_record("$query") {
    global 
$Host;
    global 
$User;
    global 
$Password;
    global 
$DBName;
    if (!
$link mysql_connect($Host$User$Password)) {
        return 
FALSE;
    }
    if (!
mysql_select_db($DBName$link)) {
        return 
FALSE;
    }
    
$result mysql_query($query$link);
    if (!
$result) {
        return 
FALSE;
    }
    
$num_rec mysql_fetch_row($result);
    
mysql_close ($link);
    return 
$num_rec[0];
}
?>


Buona domenica a tutti  :Cartelli37:
Titolo: Re:-6- Gestione completa (o quasi) del DB: Elenco delle tabelle
Inserito da: micdas - Dicembre 12, 2010, 22:13:59
Ti ringrazio, Devil
effettivamente questa Query è senz'altro meglio della mia è più veloce. Quanto prima la cambierò nella funzione

Intanto vado avanti con le mie prove   :n045: