Tutorial MySQL Backup Class
<?php
define('MSB_VERSION', '1.0.0');
define('MSB_NL', "\r\n");
define('MSB_STRING', 0);
define('MSB_DOWNLOAD', 1);
define('MSB_SAVE', 2);
define('__SEP__', "/*sep*/" );
set_time_limit( 600 );
class MySQL_Backup {
var $server = 'localhost';
var $port = 3306;
var $username = 'root';
var $password = '';
var $database = '';
var $link_id = -1;
var $connected = false;
var $tables = array();
var $drop_tables = true;
var $struct_only = false;
var $comments = true;
var $backup_dir = '';
var $fname_format = 'd_m_y__H_i_s';
var $error = '';
var $complete_inserts = false;
var $inserts_block = 200;
function Execute($task = MSB_STRING, $fname = '', $compress = false) {
if ( !( $sql = $this->_Retrieve() ) ) {
return false;
}
if ( $task == MSB_SAVE ) {
if (empty($fname)) {
$fname = $this->backup_dir;
$fname .= date($this->fname_format);
$fname .= ($compress ? '.sql.gz' : '.sql');
}
return $this->_SaveToFile($fname, $sql, $compress);
} elseif ($task == MSB_DOWNLOAD) {
if ( empty( $fname ) ) {
$fname = date($this->fname_format);
$fname .= ($compress ? '.sql.gz' : '.sql');
}
return $this->_DownloadFile($fname, $sql, $compress);
} else {
return $sql;
}
}
function _Connect() {
$value = false;
if (!$this->connected) {
$host = $this->server . ':' . $this->port;
$this->link_id = mysql_connect($host, $this->username, $this->password);
}
if ($this->link_id) {
if (empty($this->database)) {
$value = true;
} elseif ($this->link_id !== -1) {
$value = mysql_select_db($this->database, $this->link_id);
} else {
$value = mysql_select_db($this->database);
}
}
if (!$value) {
$this->error = mysql_error();
}
return $value;
}
function _Query($sql) {
if ($this->link_id !== -1) {
$result = mysql_query($sql, $this->link_id);
} else {
$result = mysql_query($sql);
}
if (!$result) {
$this->error = mysql_error();
}
return $result;
}
function _GetTables() {
$value = array();
if ( !( $result = $this->_Query('SHOW TABLES') ) ) {
return false;
}
while ( $row = mysql_fetch_row( $result ) ) {
if ( empty( $this->tables) || in_array( $row[0], $this->tables ) ) {
$value[] = $row[0];
}
}
if (!sizeof($value)) {
$this->error = 'No tables found in database.';
return false;
}
return $value;
}
function _DumpTable( $table ) {
$value = '';
$this->_Query( 'LOCK TABLES ' . $table . ' WRITE' );
if ( $this->comments ) {
$value .= '#' . MSB_NL;
$value .= '# Table structure for table `' . $table . '`' . MSB_NL;
$value .= '#' . MSB_NL . MSB_NL;
}
if ( $this->drop_tables ) {
$value .= 'DROP TABLE IF EXISTS `' . $table . '`;' . __SEP__ . MSB_NL;
}
if ( !( $result = $this->_Query('SHOW CREATE TABLE ' . $table) ) ) {
return false;
}
$row = mysql_fetch_assoc($result);
$value .= str_replace("\n", MSB_NL, $row['Create Table']) . ';' . __SEP__;
$value .= MSB_NL . MSB_NL;
if (!$this->struct_only) {
if ($this->comments) {
$value .= '#' . MSB_NL;
$value .= '# Dumping data for table `' . $table . '`' . MSB_NL;
$value .= '#' . MSB_NL . MSB_NL;
}
$value .= $this->_GetInserts($table);
}
$value .= MSB_NL . MSB_NL;
$this->_Query('UNLOCK TABLES');
return $value;
}
function _GetInserts($table) {
$value = '';
if (!($result = $this->_Query('SELECT * FROM ' . $table))) {
return false;
}
if ( $this->complete_inserts ) {
while ($row = mysql_fetch_row($result)) {
$values = '';
foreach ($row as $data) {
$values .= '\'' . addslashes($data) . '\', ';
}
$values = substr($values, 0, -2);
$value .= 'INSERT INTO ' . $table . ' VALUES (' . $values . ');' . __SEP__ . MSB_NL;
}
} else {
$blocks_counter = 0;
$blocks = array();
while ($row = mysql_fetch_row($result)) {
$values = array();
foreach ($row as $data) {
$values[] = '\'' . addslashes($data) . '\'';
}
$blocks[] = '(' . implode( ',', $values ) . ')';
if ( $blocks_counter < $this->inserts_block ) {
$blocks_counter++;
} else {
$value .= 'INSERT INTO ' . $table . ' VALUES ' . implode( ',', $blocks ) . ";" . __SEP__ . MSB_NL;
$blocks = array();
$blocks_counter = 0;
}
}
if ( count( $blocks ) ) {
$value .= 'INSERT INTO ' . $table . ' VALUES ' . implode( ',', $blocks ) . ";" . __SEP__ . MSB_NL;
}
}
return $value;
}
function _Retrieve() {
$value = '';
if (!$this->_Connect()) {
return false;
}
if ($this->comments) {
$value .= '#' . MSB_NL;
$value .= '# MySQL database dump' . MSB_NL;
$value .= '# Created by MySQL_Backup class, ver. ' . MSB_VERSION . MSB_NL;
$value .= '#' . MSB_NL;
$value .= '# Host: ' . $this->server . MSB_NL;
$value .= '# Generated: ' . date('M j, Y') . ' at ' . date('H:i') . MSB_NL;
$value .= '# MySQL version: ' . mysql_get_server_info() . MSB_NL;
$value .= '# PHP version: ' . phpversion() . MSB_NL;
if (!empty($this->database)) {
$value .= '#' . MSB_NL;
$value .= '# Database: `' . $this->database . '`' . MSB_NL;
}
$value .= '#' . MSB_NL . MSB_NL . MSB_NL;
}
if (!($tables = $this->_GetTables())) {
return false;
}
foreach ($tables as $table) {
if (!($table_dump = $this->_DumpTable($table))) {
$this->error = mysql_error();
return false;
}
$value .= $table_dump;
}
return $value;
}
function _SaveToFile($fname, $sql, $compress) {
if ($compress) {
if (!($zf = gzopen($fname, 'w9'))) {
$this->error = 'Can\'t create the output file.';
return false;
}
gzwrite($zf, $sql);
gzclose($zf);
} else {
if (!($f = fopen($fname, 'w'))) {
$this->error = 'Can\'t create the output file.';
return false;
}
fwrite($f, $sql);
fclose($f);
}
return true;
}
function _DownloadFile($fname, $sql, $compress) {
header('Content-disposition: filename=' . $fname);
header('Content-type: application/octetstream');
header('Pragma: no-cache');
header('Expires: 0');
echo ($compress ? gzencode($sql) : $sql);
return true;
}
}
?>