首页 > php代码 > PHP mysql备份与恢复的类实例详解

PHP mysql备份与恢复的类实例详解

下面转一站长写的PHP mysql备份与恢复的类实例了,这里面主要用到的是一个数据备份类与一个文件上传类了,我们结合它们两个就可以实现数据备份与文件恢复上传功能了,具体方法如下图所示。

今天推荐的精品PHP代码就是mysql备份与恢复的类了,在一般的PHP网站中都会有在线mysql备份与恢复,这样做的好处是不用每次备份都要使用 phpmyadmin 或者是客户端的工具了,使用时将备份恢复的类 dbback.class.php 进行实例化就可以使用了。

这里直接附上该类作者的说明了:该类适用于小型的网站的数据库备份,内置MYSQL连接,只需要简单的配置数据库连接及存贮备份的位置即可,类实例化并且连接数据库以后可执行以下操作:

* get_db_table($database) 取得所有数据表
* export_sql($table,$subsection=0)) 生成sql文件,注意生成sql文件只保存到服务器目录,不提供下载
* import_sql($dir) 恢复数据只导入服务器目录下的sql文件

包里作者文件的说明如下:

一、之前有发过一个mysql的备份类,但是只有备份功能,今天花了点时间,对该类进行重写, 1.新增读取数据库内所有表格 2.新增mysql在线恢复 3.修改了mysql的下载试为保存到服务器,该类具有很强的灵活性与易用性,附上两张实际开发中的应用效果.

二、另外附加前几天写的一个文件上传类,类中有附说明

<?php
/**
 * 类名:upfile
 * 作用:处理文件上传
 * 说明,该类处理单个或者多个文件上传,使用该类时,只需要实列化该类
 * 例:
 * $up = upfile()
 * $up->update_file($_FILE['filename'])
 *
 * $up->update_file   函数返回一个数组,如果是多文件上传,则为多维数据。
 * 数组的内容:
 * $fileInfo['file_size']   上传文件的大小
 * $fileInfo['file_suffix'] 上传文件的类型
 * $fileInfo['file_name']   上传文件的名字
 * $fileInfo['error']     上传文件产生的错误
 *
 * @author 赵红健[游天小虾]
 * email:328742379@qq.com
 * qq交流群:69574955 聚义堂-网页制作交
 */
class upfile {
    public $fCount = 1; //上传文件的数量
    public $fType = array(
        'jpg',
        'jpeg',
        'gif',
        'png'
    ); //文件格式
    public $fSize = 1024; //文www.phprm.com件大小单位kb
    public $fDir = 'test/'; //文件存放目录
    public $errorMsg = ''; //产生的临时错误信息�ļ��ϴ�����Ĵ���
    
    /**
     *函数名:get_tmp_file($putFile)
     *作用:取得上传的临时文件名
     *@param array $putFile
     *@return string $upImg 返回临时文件名
     */
    function get_tmp_file($putFile) {
        if ($this->fCount == 1) {
            $tmpFile = $putFile['tmp_name'];
        } else {
            for ($i = 0; $i < $this->fCount; $i++) {
                $tmpFile[] = $putFile['tmp_name'][$i];
            }
        }
        return $tmpFile;
    }
    /**
     *函数名:get_suffix($fileName)
     *作用:取得文件的后缀名
     *@param file $fileName
     *@return string $suffixName 返回后缀名
     */
    function get_suffix($fileName) {
        $link = pathinfo($fileName);
        $suffixName = strtolower($link['extension']);
        return $suffixName;
    }
    /**
     *验证文件大小
     *@author 赵红健
     *@param $fileSize
     *@return booln
     */
    function check_file_size($fileSize) {
        $this->errorMsg = '';
        if ($fileSize / 1000 > $this->fSize) {
            $this->errorMsg = '警告:文件超出大小!';
            return false;
        } else {
            return true;
        }
    }
    /**
     *验证文件类型是否合法
     *@author 赵红健
     *@param $fileSuffix
     *@return booln
     */
    function check_file_suffix($fileSuffix) {
        $this->errorMsg = '';
        if (!in_array($fileSuffix, $this->fType)) {
            $this->errorMsg = '警告:文件类型不在允许范围内!';
            return false;
        } else {
            return true;
        }
    }
    /**
     *移动临时文件
     *@author 赵红健
     *@param $fileSuffix
     *@return booln
     */
    function move_temp_file($tmpFile, $targetFile) {
        $this->errorMsg = '';
        if (!move_uploaded_file($tmpFile, $targetFile)) {
            $this->errorMsg = '警告:文件移动失败!';
            return false;
        } else {
            return true;
        }
    }
    /**
     *函数名:update_file($putFile)
     *作用:上传文件
     *@param array $putFile
     *@return array 文件信息
     */
    function update_file($putFile) {
        $tmpFile = $this->get_tmp_file($putFile);
        if (!file_exists($this->fDir)) {
            $this->errorMsg[] = '错误:目录' . $this->fDir . '不存在';
            return $this->errorMsg;
        }
        $this->fDir = substr($this->fDir, strlen($this->fDir) - 1, 1) == '/' ? $this->fDir : $this->fDir . '/';
        if (!is_array($putFile['size'])) {
            $fileInfo['file_size'] = $putFile['size'];
            if (!$this->check_file_size($fileInfo['file_size'])) {
                $fileInfo['error'] = $this->errorMsg;
                return $fileInfo;
            }
            $fileInfo['file_suffix'] = $this->get_suffix($putFile['name']);
            if (!$this->check_file_suffix($fileInfo['file_suffix'])) {
                $fileInfo['error'] = $this->errorMsg;
                return $fileInfo;
            }
            $fileInfo['file_name'] = date('ymdhms') . '.' . $fileInfo['file_suffix'];
            if (!$this->move_temp_file($tmpFile, $this->fDir . $fileInfo['file_name'])) {
                $fileInfo['error'] = $this->errorMsg;
                return $fileInfo;
            }
            return $fileInfo;
        } else {
            for ($i = 0; $i < $this->fCount; $i++) {
                $fileInfo[$i]['file_size'] = $putFile['size'][$i];
                if (!$this->check_file_size($fileInfo[$i]['file_size'])) {
                    $fileInfo[$i]['error'] = $this->errorMsg;
                    continue;
                }
                $fileInfo[$i]['file_suffix'] = $this->get_suffix($putFile['name'][$i]);
                if (!$this->check_file_suffix($fileInfo[$i]['file_suffix'])) {
                    $fileInfo[$i]['error'] = $this->errorMsg;
                    continue;
                }
                $fileInfo[$i]['file_name'] = date('ymdhms') . rand() . '.' . $fileInfo[$i]['file_suffix'];
                if (!$this->move_temp_file($tmpFile[$i], $this->fDir . $fileInfo[$i]['file_name'])) {
                    $fileInfo[$i]['error'] = $this->errorMsg;
                    continue;
                }
            }
            return $fileInfo;
        }
    }
}
?>

备份类

<?php
/**
 * 说明,该类适用于小型的网站的数据库备份,内置MYSQL连接,只需要简单配置数据连接
 * 及存贮备份的位置即可。
 * 类实列化并且连接数据库以后可执行以下操作
 * get_db_table($database)    取得所有数据表
 * export_sql($table,$subsection=0))   生成sql文件,注意生成sql文件只保存到服务器目录,不提供下载
 * import_sql($dir)     恢复数据只导入服务器目录下的sql文件
 * 该类制作简单,可任意传播,如何您对该类有什么提议,请发送邮件给小虾
 * @author 赵红健[游天小虾]
 * email:328742379@qq.com
 * qq交流群:69574955 聚义堂-网页制作交
 */
class data {
    public $data_dir = "class/"; //备份文件存放的路径
    public $transfer = ""; //临时存放sql[切勿不要对该属性赋值,否则会生成错误的sql语句]
    
    /**
     *数据库连接
     *@param string $host 数据库主机名
     *@param string $user 用户名
     *@param string $pwd  密码
     *@param string $db   选择数据库名
     *@param string $charset 编码方式
     */
    function connect_db($host, $user, $pwd, $db, $charset = 'gbk') {
        if (!$conn = mysql_connect($host, $user, $pwd)) {
            return false;
        }
        mysql_select_db($db);
        mysql_query("set names $charset");
        return true;
    }
    /**
     * 生成sql语句
     * @param   $table     要备份的表
     * @return  $tabledump 生成的sql语句
     */
    public function set_sql($table, $subsection = 0, &$tableDom = '') {
        $tableDom.= "DROP TABLE IF EXISTS $tablen";
        $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  database $database 要操作的数据库名
     *@return array    $dbArray  所列表的数据库表
     */
    public function get_db_table($database) {
        $result = mysql_list_tables($database);
        while ($tmpArry = mysql_fetch_row($result)) {
            $dbArry[] = $tmpArry[0];
        }
        return $dbArry;
    }
    /**
     *验证目录是否有效
     *@param diretory $dir
     *@return booln
     */
    function check_write_dir($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 != '..') {
                        @unlink($dir . $fileArry[$i]);
                    }
                }
            }
        }
        return true;
    }
    /**
     *将数据写入到文件中
     *@param file $fileName 文件名
     *@param string $str   要写入的信息
     *@return booln 写入成功则返回true,否则false
     */
    private function write_sql($fileName, $str) {
        $re = true;
        if (!@$fp = fopen($fileName, "w+")) {
            $re = false;
            echo "在打开文件时遇到错误,备份失败!";
        }
        if (!@fwrite($fp, $str)) {
            $re = false;
            echo "在写入信息时遇到错误,备份失败!";
        }
        if (!@fclose($fp)) {
            $re = false;
            echo "在关闭文件 时遇到错误,备份失败!";
        }
        return $re;
    }
    /**
     *生成www.phprm.com sql文件
     *@param string $sql sql    语句
     *@param number $subsection 分卷大小,以KB为单位,为0表示不分卷
     */
    public function export_sql($table, $subsection = 0) {
        if (!$this->check_write_dir($this->data_dir)) {
            echo '您没有权限操作目录,备份失败';
            return false;
        }
        if ($subsection == 0) {
            if (!is_array($table)) {
                $this->set_sql($table, 0, $this->transfer);
            } else {
                for ($i = 0; $i < count($table); $i++) {
                    $this->set_sql($table[$i], 0, $this->transfer);
                }
            }
            $fileName = $this->data_dir . date("Ymd", time()) . '_all.sql';
            if (!$this->write_sql($fileName, $this->transfer)) {
                return false;
            }
        } else {
            if (!is_array($table)) {
                $sqlArry = $this->set_sql($table, $subsection, $this->transfer);
                $sqlArry[] = $this->transfer;
            } else {
                $sqlArry = array();
                for ($i = 0; $i < count($table); $i++) {
                    $tmpArry = $this->set_sql($table[$i], $subsection, $this->transfer);
                    $sqlArry = array_merge($sqlArry, $tmpArry);
                }
                $sqlArry[] = $this->transfer;
            }
            for ($i = 0; $i < count($sqlArry); $i++) {
                $fileName = $this->data_dir . date("Ymd", time()) . '_part' . $i . '.sql';
                if (!$this->write_sql($fileName, $sqlArry[$i])) {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     *载入sql文件
     *@param diretory $dir
     *@return booln
     *注意:请不在目录下面存放其它文件,或者目录
     *以节省恢复时间
     */
    public function import_sql($dir) {
        if ($link = opendir($dir)) {
            $fileArry = scandir($dir);
            $pattern = "_part[0-9]+.sql$|_all.sql$";
            for ($i = 0; $i < count($fileArry); $i++) {
                if (eregi($pattern, $fileArry[$i])) {
                    $sqls = file($dir . $fileArry[$i]);
                    foreach ($sqls as $sql) {
                        str_replace("\r", "", $sql);
                        str_replace("\n", "", $sql);
                        if (!mysql_query(trim($sql))) return false;
                    }
                }
            }
            return true;
        }
    }
}
//$d = new data();
//连接数据库
//if(!$d->connect_db('localhost','root','','guestbook','gbk')){
// echo '数据库连接失败';
//}
//查找数据库内所有数据表
//$tableArry = $d->get_db_table('guestbook');
//备份并生成sql文件
//if(!$d->export_sql($tableArry)){
// echo '备份失败';
//}else{
// echo '备份成功';
//}
//恢复导入sql文件夹
//if($d->import_sql($d->data_dir)){
// echo '恢复成功';
//}else{
// echo '恢复失败';
//}

?>

永久链接:http://www.phprm.com/code/63530.html

转载随意!带上文章地址吧。

标签:foreach substr 文件上传 select fopen opendir phpmyadmin mysql备份

相关文章

发表留言