Server : Apache
System : Linux iZ2vcgyutqttsd1p850kl8Z 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64
User : www ( 1000)
PHP Version : 5.6.40
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/saimikebio.com/mobile/include/kernel/library/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/saimikebio.com/mobile/include/kernel/library/Dbbak.class.php
<?php



// +----------------------------------------------------------------------

// | EcTouch [ 专注移动电商: 商创网络科技 ]

// +----------------------------------------------------------------------

// | Copyright (c) 2014 http://ectouch.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: EcTouch Team <zhong@ecmoban.com> (QQ: 2880175560)

// +----------------------------------------------------------------------



/**

 * 内置MYSQL连接,只需要简单配置数据连接

  使用方法如下



  $db = new Dbbak('localhost','root','','ectouch_db','utf8','data/dbbak/');



  //查找数据库内所有数据表

  $tableArry = $db->getTables();



  //备份并生成sql文件

  if(!$db->exportSql($tableArry)){

  echo '备份失败';

  }else{

  echo '备份成功';

  }



  //恢复导入sql文件夹

  if($db->importSql()){

  echo '恢复成功';

  }else{

  echo '恢复失败';

  }



 */

class Dbbak {



    public $dbhost; //数据库主机

    public $dbuser; //数据库用户名

    public $dbpw; //数据库密码

    public $dbname; //数据库名称

    public $dataDir; //备份文件存放的路径

    protected $transfer = "";   //临时存放sql[切勿不要对该属性赋值,否则会生成错误的sql语句]



    public function __construct($dbhost, $dbuser, $dbpw, $dbname, $charset = 'utf8', $dir = 'data/dbbak/') {

        $this->connect($dbhost, $dbuser, $dbpw, $dbname, $charset); //连接数据

        $this->dataDir = $dir;

    }



    /**

     * 数据库连接

     * @param string $host 数据库主机名

     * @param string $user 用户名

     * @param string $pwd  密码

     * @param string $db   选择数据库名

     * @param string $charset 编码方式

     */

    public function connect($dbhost, $dbuser, $dbpw, $dbname, $charset = 'utf8') {

        $this->dbhost = $dbhost;

        $this->dbuser = $dbuser;

        $this->dbpw = $dbpw;

        $this->dbname = $dbname;

        if (!$conn = mysql_connect($dbhost, $dbuser, $dbpw)) {

            $this->error('无法连接数据库服务器');

            return false;

        }

        mysql_select_db($this->dbname) or $this->error('选择数据库失败');

        mysql_query("set names $charset");

        return true;

    }



    /**

     * 列表数据库中的表

     * @param  database $database 要操作的数据库名

     * @return array    $dbArray  所列表的数据库表

     */

    public function getTables($database = '') {

        $database = empty($database) ? $this->dbname : $database;

        $result = mysql_query("SHOW TABLES FROM `$database`") or die(mysql_error());

        //	$result = mysql_list_tables($database);//mysql_list_tables函数不建议使用

        while ($tmpArry = mysql_fetch_row($result)) {

            $dbArry[] = $tmpArry[0];

        }

        return $dbArry;

    }



    /**

     * 生成sql文件,导出数据库

     * @param string $sql sql    语句

     * @param number $subsection 分卷大小,以KB为单位,为0表示不分卷

     */

    public function exportSql($table = '', $subsection = 0) {

        $table = empty($table) ? $this->getTables() : $table;

        if (!$this->_checkDir($this->dataDir)) {

            $this->error('您没有权限操作目录,备份失败');

            return false;

        }



        if ($subsection == 0) {

            if (!is_array($table)) {

                $this->_setSql($table, 0, $this->transfer);

            } else {

                for ($i = 0; $i < count($table); $i++) {

                    $this->_setSql($table[$i], 0, $this->transfer);

                }

            }

            $fileName = $this->dataDir . date("Ymd", time()) . '_all.sql.php';

            if (!$this->_writeSql($fileName, $this->transfer)) {

                return false;

            }

        } else {

            if (!is_array($table)) {

                $sqlArry = $this->_setSql($table, $subsection, $this->transfer);

                $sqlArry[] = $this->transfer;

            } else {

                $sqlArry = array();

                for ($i = 0; $i < count($table); $i++) {

                    $tmpArry = $this->_setSql($table[$i], $subsection, $this->transfer);

                    $sqlArry = array_merge($sqlArry, $tmpArry);

                }

                $sqlArry[] = $this->transfer;

            }

            for ($i = 0; $i < count($sqlArry); $i++) {

                $fileName = $this->dataDir . date("Ymd", time()) . '_part' . $i . '.sql.php';

                if (!$this->_writeSql($fileName, $sqlArry[$i])) {

                    return false;

                }

            }

        }

        return true;

    }



    /*

     * 载入sql文件,恢复数据库

     * @param diretory $dir

     * @return booln

     * 注意:请不在目录下面存放其它文件和目录,以节省恢复时间

     */

    public function importSql($dir = '') {



        if (is_file($dir)) {

            return $this->_importSqlFile($dir);

        }

        $dir = empty($dir) ? $this->dataDir : $dir;

        if ($link = opendir($dir)) {

            $fileArry = scandir($dir);

            $pattern = "/_part[0-9]+.sql.php$|_all.sql.php$/";

            $num = count($fileArry);

            for ($i = 0; $i < $num; $i++) {

                if (preg_match($pattern, $fileArry[$i])) {

                    if (false == $this->_importSqlFile($dir . $fileArry[$i])) {

                        return false;

                    }

                }

            }

            return true;

        }

    }



    //执行sql文件,恢复数据库

    protected function _importSqlFile($filename = '') {

        $sqls = file_get_contents($filename);

        $sqls = substr($sqls, 13);

        $sqls = explode("\n", $sqls);

        if (empty($sqls))

            return false;



        foreach ($sqls as $sql) {

            if (empty($sql))

                continue;

            if (!mysql_query(trim($sql))) {

                $this->error('恢复失败:' . mysql_error());

                return false;

            }

        }

        return true;

    }



    /**

     * 生成sql语句

     * @param   $table     要备份的表

     * @return  $tabledump 生成的sql语句

     */

    protected function _setSql($table, $subsection = 0, &$tableDom = '') {

        $tableDom .= "DROP TABLE IF EXISTS $table\n";

        $createtable = mysql_query("SHOW CREATE TABLE $table");

        $create = mysql_fetch_row($createtable);

        $create[1] = str_replace("\n", "", $create[1]);

        $create[1] = str_replace("\t", "", $create[1]);



        $tableDom .= $create[1] . ";\n";



        $rows = mysql_query("SELECT * FROM $table");

        $numfields = mysql_num_fields($rows);

        $numrows = mysql_num_rows($rows);

        $n = 1;

        $sqlArry = array();

        while ($row = mysql_fetch_row($rows)) {

            $comma = "";

            $tableDom .= "INSERT INTO $table VALUES(";

            for ($i = 0; $i < $numfields; $i++) {

                $tableDom .= $comma . "'" . mysql_escape_string($row[$i]) . "'";

                $comma = ",";

            }

            $tableDom .= ")\n";

            if ($subsection != 0 && strlen($this->transfer) >= $subsection * 1000) {

                $sqlArry[$n] = $tableDom;

                $tableDom = '';

                $n++;

            }

        }

        return $sqlArry;

    }



    /**

     * 验证目录是否有效,同时删除该目录下的所有文件

     * @param diretory $dir

     * @return booln

     */

    protected function _checkDir($dir) {

        if (!is_dir($dir)) {

            @mkdir($dir, 0777);

        }

        if (is_dir($dir)) {

            if ($link = opendir($dir)) {

                $fileArry = scandir($dir);

                for ($i = 0; $i < count($fileArry); $i++) {

                    if ($fileArry[$i] != '.' || $fileArry[$i] != '..') {

                        @unlink($dir . $fileArry[$i]);

                    }

                }

            }

        }

        return true;

    }



    /**

     * 将数据写入到文件中

     * @param file $fileName 文件名

     * @param string $str   要写入的信息

     * @return booln 写入成功则返回true,否则false

     */

    protected function _writeSql($fileName, $str) {

        $re = true;

        if (!$fp = @fopen($fileName, "w+")) {

            $re = false;

            $this->error("在打开文件时遇到错误,备份失败!");

        }

        if (!@fwrite($fp, '<?php exit;?>' . $str)) {

            $re = false;

            $this->error("在写入信息时遇到错误,备份失败!");

        }

        if (!@fclose($fp)) {

            $re = false;

            $this->error("在关闭文件 时遇到错误,备份失败!");

        }

        return $re;

    }



    public function error($str) {

        throw new Exception($str);

    }



}



?>