<?php
/**
*
* Use this class to do a backup of your database
* @author Raul Souza Silva (raul.3k@gmail.com)
* @category Database
* @copyright No one. You can copy, edit, do anything you want. If you change anything to better, please let me know.
*
*/
Class DBBackup {
/**
*
* The host you will connect
* @var String
*/
private $host;
/**
*
* The driver you will use to connect
* @var String
*/
private $driver;
/**
*
* The user you will use to connect to a database
* @var String
*/
private $user;
/**
*
* The password you will use to connect to a database
* @var String
*/
private $password;
/**
*
* The database you will use to connect
* @var String
*/
private $dbName;
/**
*
* String to connect to the database using PDO
* @var String
*/
private $dsn;
/**
*
* Array with the tables of the database
* @var Array
*/
private $tables = array();
/**
*
* Hold the connection
* @var ObjectConnection
*/
private $handler;
/**
*
* Array to hold the errors
* @var Array
*/
private $error = array();
/**
*
* The result string. String with all queries
* @var String
*/
private $final;
/**
*
* The main function
* @method DBBackup
* @uses Constructor
* @param Array $args{host, driver, user, password, database}
* @example $db = new DBBackup(array('host'=>'my_host', 'driver'=>'bd_type(mysql)', 'user'=>'db_user', 'password'=>'db_password', 'database'=>'db_name'));
*/
public function DBBackup($args){
if(!$args['host']) $this->error[] = 'Parameter host missing';
if(!$args['user']) $this->error[] = 'Parameter user missing';
if(!isset($args['password'])) $this->error[] = 'Parameter password missing';
if(!$args['database']) $this->error[] = 'Parameter database missing';
if(!$args['driver']) $this->error[] = 'Parameter driver missing';
if(count($this->error)>0){
return;
}
$this->host = $args['host'];
$this->driver = $args['driver'];
$this->user = $args['user'];
$this->password = $args['password'];
$this->dbName = $args['database'];
$this->final = 'CREATE DATABASE ' . $this->dbName.";\n\n";
if($this->host=='localhost'){
// We have a little issue in unix systems when you set the host as localhost
$this->host = '127.0.0.1';
}
$this->dsn = $this->driver.':host='.$this->host.';dbname='.$this->dbName;
$this->connect();
$this->getTables();
$this->generate();
}
/**
*
* Call this function to get the database backup
* @example DBBackup::backup();
*/
public function backup(){
//return $this->final;
if(count($this->error)>0){
return array('error'=>true, 'msg'=>$this->error);
}
return array('error'=>false, 'msg'=>$this->final);
}
/**
*
* Generate backup string
* @uses Private use
*/
private function generate(){
foreach ($this->tables as $tbl) {
$this->final .= '--CREATING TABLE '.$tbl['name']."\n";
$this->final .= $tbl['create'] . ";\n\n";
$this->final .= '--INSERTING DATA INTO '.$tbl['name']."\n";
$this->final .= $tbl['data']."\n\n\n";
}
$this->final .= '-- THE END'."\n\n";
}
/**
*
* Connect to a database
* @uses Private use
*/
private function connect(){
try {
$this->handler = new PDO($this->dsn, $this->user, $this->password);
} catch (PDOException $e) {
$this->handler = null;
$this->error[] = $e->getMessage();
return false;
}
}
/**
*
* Get the list of tables
* @uses Private use
*/
private function getTables(){
try {
$stmt = $this->handler->query('SHOW TABLES');
$tbs = $stmt->fetchAll();
$i=0;
foreach($tbs as $table){
$this->tables[$i]['name'] = $table[0];
$this->tables[$i]['create'] = $this->getColumns($table[0]);
$this->tables[$i]['data'] = $this->getData($table[0]);
$i++;
}
unset($stmt);
unset($tbs);
unset($i);
return true;
} catch (PDOException $e) {
$this->handler = null;
$this->error[] = $e->getMessage();
return false;
}
}
/**
*
* Get the list of Columns
* @uses Private use
*/
private function getColumns($tableName){
try {
$stmt = $this->handler->query('SHOW CREATE TABLE '.$tableName);
$q = $stmt->fetchAll();
$q[0][1] = preg_replace("/AUTO_INCREMENT=[\w]*./", '', $q[0][1]);
return $q[0][1];
} catch (PDOException $e){
$this->handler = null;
$this->error[] = $e->getMessage();
return false;
}
}
/**
*
* Get the insert data of tables
* @uses Private use
*/
private function getData($tableName){
try {
$stmt = $this->handler->query('SELECT * FROM '.$tableName);
$q = $stmt->fetchAll(PDO::FETCH_NUM);
$data = '';
foreach ($q as $pieces){
foreach($pieces as &$value){
$value = htmlentities(addslashes($value));
}
$data .= 'INSERT INTO '. $tableName .' VALUES (\'' . implode('\',\'', $pieces) . '\');'."\n";
}
return $data;
} catch (PDOException $e){
$this->handler = null;
$this->error[] = $e->getMessage();
return false;
}
}
}
?>
|