LORETTA B. nel-web forum

Linguaggi di programmazione => Php e MySql (data base) => Topic aperto da: micdas - Novembre 28, 2010, 15:32:09

Titolo: -4- Gestione completa (o quasi) del DB: Creazione di una tabella
Inserito da: micdas - Novembre 28, 2010, 15:32:09
Creazione di una tabella
Per questa operazione uso due files:
* crea_tables.php
* crea_tables_crea.php


Questo il codice del file crea_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>Creazione di una tabella</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>Creazione di una nuova tabella</h1>
    <h2>creazione di una nuova tabella</h2>
    <p>Da questa pagina è possibile creare una tabella se questa non esiste</p>
<?php
include ("res/config_db.php");
include (
"res/functions.php");
$Query "SHOW TABLES FROM $DBName";
$all_tables show_tables($Query);
if (
in_array($table$all_tables)) {
    echo 
"La tabella " $table " esiste<br />\n";
    echo 
"Non necessaria la sua creazione<br />\n";
} else {
    echo 
"La tabella " $table " non esiste<br />\n";
    echo 
"<a href=\"crea_tables_crea.php?tabella=".$table."\">Per creare la tabella " $table "</a><br />\n";
}
?>

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

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

In questo file non si nota nulla di particolare, ma diamo lo stesso alcune note:

La funzione PHP include ()
Si parte con l'inclusione di due files che contengono alcune variabili comuni a tutto il settore (il primo file incluso) ed alcune funzioni a cui faremo spesso riferimento (il secondo file incluso):
Codice: Non sei autorizzato a vedere i links. Registrati o Login
include ("res/config_db.php");
include ("res/functions.php");

La funzione personale show_tables()
Subito dopo notiamo la prima Query con la quale adremo ad interrogare la nostra funzione personale, show_tables().
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query = "SHOW TABLES FROM $DBName";
$all_tables = show_tables($Query);

Questa la funzione creata per leggere le tabelle nel nostro DB:
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;
}
?>

La query SHOW TABLES FROM $DBName fa leggere tutte le tabelle presenti nel Data Base attivo
Nella funzione show_tables() le tabelle, se trovate, vengono poste in una matrice e restituite alla pagina richiedente.
L'esistenza della tabella viene accertata usando la funzione PHP in_array() usando l'istruzione condizionale:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
if (in_array($table, $all_tables)) {
................
} else {
................
}

Se la tabella esiste viene visualizzato il messaggio "La tabella esiste", altrimenti viene mostrato un link che porterà alla seconda pagina che provvederà alla sua creazione.


Questo il codice del file crea_tables_crea.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>Creazione di una tabella</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>Creazione di una nuova tabella</h1>
    <h2>creazione di una nuova tabella</h2>
    <p>In questo proveremo a creare una tabella se questa non esiste</p>
<?php
include ("res/config_db.php");
include (
"res/functions.php");
$tabella $_REQUEST['tabella'];
$Query "SHOW TABLES FROM $DBName";
$all_tables show_tables($Query);
if (
in_array($table$all_tables)) {
    echo 
"La tabella " $table " esiste<br />\n";
    echo 
"Non necessaria la sua creazione<br />\n";
} else {
    echo 
"La tabella " $table " non esiste<br />\n";
    echo 
"Creazione della tabella " $tabella "<br />\n";
//    $Query .= " (id mediumint unsigned NOT NULL auto_increment, ";
    
$Query "CREATE TABLE " $tabella;
    
$Query .= " (id INT(10) NOT NULL AUTO_INCREMENT, ";
    
$Query .= implode(", "$tipi_campi);
    
$Query .= ", PRIMARY KEY (id)) ENGINE = MyISAM";
    echo 
"La query<br />\n" $Query "<br /><br />\n";
    if (
execute_query($Query)) {
        echo 
"La tabella è stata creata con successo<br />\n";
    } else {
        echo 
"Si sono verificati dei problemi nella procedura<br />\n";
    }
}

?>

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

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

Anche qui pochissime note in quanto il codice non è eccessivamente complesso.

La funzione PHP include ()
Si parte con la solita inclusione dei files comuni
Codice: Non sei autorizzato a vedere i links. Registrati o Login
include ("res/config_db.php");
include ("res/functions.php");

La funzione personaòe show_tables()
Quindi si controlla se la tabella esiste tramite la mia funzione 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;
}
?>


Se tutto procede come previsto il restante codice viene scritto nella else della if.

Questo controllo si rende necessario in questa fase solo per evitare il tentativo di creare nuovamente la tabella che causerebbe un errore se si fa refresh sulla pagina.
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query = "SHOW TABLES FROM $DBName";
$all_tables = show_tables($Query);
if (in_array($table, $all_tables)) {
...................
} else {
...............
}

Creazione della Query per creare la tabella
Per le Query io uso scriverle partendo dalle matrici.

Per questo nel file config_db.php ho messo questa matrice:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
$tipi_campi 
= array (
    
"cognome varchar(100)",
    
"nome varchar(100)",
    
"nato DATE NOT NULL DEFAULT '0000-00-00'",
    
"indirizzo varchar(100)",
    
"cap varchar(10)",
    
"citta varchar(100)",
    
"prov varchar(10)",
    
"tel1 varchar(20)",
    
"tel2 varchar(20)",
    
"tel3 varchar(100)"
);
/*
    ASSEGNAZIONE DEI TIPI DI DATI AI VARI CAMPI:
    in questo caso abbiamo assegnato a tutti i campi 
    il tipo varchar(xxx) di lunghezza variabile a seconda 
    del tipo di dati che che ci aspettiamo 
    solo il campo "nato" ha un tipo DATE
    nel formato '0000-00-00'
*/
?>


Nella pagina dove mi serve agisco in questo modo:

creo la prima e la seconda parte della Query concatenando nella variabile $Query i primi due segmenti di quella che deve essere la stringa finale:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query = "CREATE TABLE " . $tabella;
$Query .= " (id INT(10) NOT NULL AUTO_INCREMENT, ";

sempre nella stessa variabile, $Query, concateno il terzo segmento della stringa usando la funzione PHP implode() sulla matrice $tipi_campi usando la virgola ed uno spazio come caratteri separatori:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query .= implode(", ", $tipi_campi);

termino concatenando nella variabile $Query l'ultimo segmento di stringa:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
$Query .= ", PRIMARY KEY (id)) ENGINE = MyISAM";
Alla fine ottengo la Query desiderata:

Codice: Non sei autorizzato a vedere i links. Registrati o Login
CREATE TABLE rubrica (id INT(10) NOT NULL AUTO_INCREMENT, cognome varchar(100), nome varchar(100), nato DATE NOT NULL DEFAULT '0000-00-00', indirizzo varchar(100), cap varchar(10), citta varchar(100), prov varchar(10), tel1 varchar(20), tel2 varchar(20), tel3 varchar(100), PRIMARY KEY (id)) ENGINE = MyISAM
Funzione personale execute_query()
Ottenuta la Query finale possiamo far lavorare il DB. Chiamo in causa la mia funzione personale che non ritorna alcun valore.
Codice: Non sei autorizzato a vedere i links. Registrati o Login
if (execute_query($Query)) {
..................
} else {
..............
}

Questa la funzione chiamata:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
function execute_query($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;
    }
    
mysql_close ($link);
    return 
TRUE;
}
?>



Queste le due pagine che servono per creare una tabella.
La prossima volta vedremo la procedura, altrettanto semplice per eliminare una tabella

Ciao e buon lavoro.