PDA

View Full Version : [PHP] Esportazione DB, consigli su ottimizzazione codice sorgente


wais
23-09-2011, 07:30
Salve a tutti, ho scritto una classe php che esporta la struttura e i dati di un DB in un file .sql.
La classe in questione utilizza l'information schema quindi non funziona con DB che non lo supportano.
Da notare che la classe in questione utilizza un altra classe per eseguire effettivamente le query al DB, non richiede parametri ma l' ho scritta per un mio DB in cui mi servivano solo le tabelle che iniziavano con zz_NOMETABELLA.
Posto il codice, volevo sapere dagli esperti come puņ essere ottimizzato,se sarebbe meglio cambiare logica lasciando stare l'information schema, se a livelli di tempi di esecuzione, considerando eventualmente DB di grosse dimensioni risulterebbe lento e macchinoso e via dicendo, insomma pareri e consigli...a prestoooo


<?php
/*
*
* CLASSE PER L'ESPORTAZIONE DI UN DB MYSQL IN UN FILE .sql
*
*/
class cDB_Export{

private $value = Array(
"file_content" => ""
);

function __construct(){
$conn = new scConnect();
$conn->stampa = false;

$conn->query = "SELECT COUNT(*) AS tot FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'";
$conn->descrizione = "select tot elenco table";
$tot_tables = $conn->select();

$conn->query = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'";
$conn->descrizione = "select elenco table";
$val_tables = $conn->select();

for($b = 0; $b<$tot_tables[0]['tot']; $b++){
$structure_table = $this->get_StructureTable($val_tables[$b]["TABLE_NAME"]);

$this->CreateTable_query($structure_table,$val_tables[$b]["TABLE_NAME"]);
$this->file_content .= "\n";
$this->CreateInsert_query($structure_table,$val_tables[$b]["TABLE_NAME"]);
$this->file_content .= "\n\n";
$this->file_content .= "----------------------------------------------------------------------------------------------------\n\n";
}

$data = date ("d/m/Y");
$appoggio = split("/", $data);
$data = $appoggio[0] . "" . $appoggio[1] . "" . $appoggio[2];

$myFile = $data . "_BACKUP_DB.sql";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $this->file_content);
fclose($fh);

echo "operazione terminata";
unset($conn);
}

function __destruct(){}

public function __get($valore){
return $this->value[$valore];
}

public function __set($attributo, $valore){
/*$ut = new scUtility();
$ut->str = $valore;
$this->value[$attributo] = $ut->check_input();*/
}

//FIRST STEP - get table structure
private function get_StructureTable($tbl_name){
$conn = new scConnect();
$conn->stampa = false;

$conn->query = " DESCRIBE " . $tbl_name . " ";
$conn->descrizione = "describe table";

$val = $conn->select();
unset($conn);
return $val;
}

//SECOND STEP - "create the 'create query'"
private function CreateTable_query($tbl_structure,$tbl_name){
$create_query = "DROP TABLE IF EXISTS `" . $tbl_name . "`; CREATE TABLE IF NOT EXISTS `" . $tbl_name . "` (\n";

for($i=0; $i<count($tbl_structure); $i++){
if(($tbl_structure[$i]['Null'] == "no") || ($tbl_structure[$i]['Null'] == "NO")){
$create_query .= "`" . $tbl_structure[$i]['Field'] . "` " . $tbl_structure[$i]['Type'] . " NOT NULL ";
}else{
$create_query .= "`" . $tbl_structure[$i]['Field'] . "` " . $tbl_structure[$i]['Type'] . " DEFAULT NULL " ;
}

if(($tbl_structure[$i]['Key'] == "pri") || ($tbl_structure[$i]['Key'] == "PRI"))
$create_query .= " PRIMARY KEY " . $tbl_structure[$i]['Extra'];

if($i < count($tbl_structure)-1)
$create_query .= ",";

$create_query .= "\n";
}
$create_query .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;";
$this->file_content .= $create_query;
}

//THIRD STEP - create the insert query of the values
private function CreateInsert_query($tbl_structure,$tbl_name){
$conn = new scConnect();
$conn->stampa = false;

$insert_query = "";

$conn->query = "SELECT COUNT(*) AS tot FROM " . $tbl_name;
$conn->descrizione = "SELECT COUNT";
$val_tot = $conn->select();

$conn->query = "SELECT * FROM " . $tbl_name;
$conn->descrizione = "SELECT *";
$val = $conn->select();

for($ii=0; $ii<$val_tot[0]['tot']; $ii++){
$appoggio_query = "INSERT INTO " . $tbl_name . "(";

for($i=0; $i<count($tbl_structure); $i++){
$appoggio_query .= " " . $tbl_structure[$i]['Field'] ;

if($i < count($tbl_structure)-1)
$appoggio_query .= ",";
else
$appoggio_query .= ") VALUES ( ";
}

for($a=0; $a<count($tbl_structure); $a++){
$appoggio_query .= "'" . $val[$ii][$a] . "'";
if($a < count($tbl_structure)-1)
$appoggio_query .= ",";
else
$appoggio_query .= ")";
}

$insert_query .= $appoggio_query . "\n\n";
}

$this->file_content .= $insert_query;
unset($conn);
}
}
?>