当前位置 : 主页 > 网络编程 > PHP >

备份MySQL的php类

来源:互联网 收集:自由互联 发布时间:2021-07-03
?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';
<?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;
       }
    }

    ?>
网友评论