«

PHP/thinkPHP 备份恢复mysql数据库

时间:2023-1-11 16:14     作者:六度科技     分类: PHP


原文链接

thinkphp处本人有修BUG

1.PHP导出

代码如下(示例):

//配置信息
$cfg_dbhost = 'localhost';
$cfg_dbname = 'xxx';
$cfg_dbuser = 'root';
$cfg_dbpwd = 'root';
$cfg_db_language = 'utf8';
$to_file_name = "xxx.sql"; //导出文件名

//链接数据库
$link = mysqli_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,$cfg_dbname);
//编码方式
mysqli_query($link,"set names ".$cfg_db_language);
//查询数据库中所有表名,并保存在数组中
$tables = mysqli_query($link,"SHOW TABLES");
while($row = mysqli_fetch_array($tables)){
    $tabList[] = $row[0];
}

//将每个表的表结构导出到文件
foreach($tabList as $val){
    $sql = "show create table ".$val;
    $res = mysqli_query($link,$sql);
    $row = mysqli_fetch_array($res);
    $info = "-- ----------------------------\r\n";
    $info .= "-- Table structure for `".$val."`\r\n";
    $info .= "-- ----------------------------\r\n";
    $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
    $sqlStr = $info.$row[1].";\r\n\r\n";
    //把$info写入文件,文件不存在则创建
    file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
    //释放资源
    mysqli_free_result($res);
}
//将每个表的数据导出到文件
foreach($tabList as $val){
    $sql = "select * from ".$val;
    //若只需导出指定数据
         //    switch($val){
        //        case '表名':
        //           $sql = "select * from ".$val." where 条件;
        //           break;
        //        default:
        //            $sql = "select * from ".$val;
        //      }
    $res = mysqli_query($link,$sql);
    //如果表中没有数据,则跳出循环
   if(mysqli_num_rows($res)<1) continue;
    $info = "-- ----------------------------\r\n";
    $info .= "-- Records for `".$val."`\r\n";
    $info .= "-- ----------------------------\r\n";
    file_put_contents($to_file_name,$info,FILE_APPEND);
    //读取数据
    while($row = mysqli_fetch_row($res)){
        $sqlStr = "INSERT INTO `".$val."` VALUES (";
        foreach($row as $zd){
          $sqlStr .= "'".$zd."', ";
        }
        //去掉最后一个逗号和空格
        $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
        $sqlStr .= ");\r\n";
        file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
   }

    //释放资源
    mysqli_free_result($res);
    file_put_contents($to_file_name,"\r\n",FILE_APPEND);
}

2.ThinkPHP框架导出

代码如下(示例):

//设置文件名
$to_file_name = "./updata/".date("Y-m-d_H-i-s").".sql";
//获取表名列表
        $tabList = Db::connect()->getTables();
        //将每个表的表结构导出到文件

        foreach ($tabList as $val) {
            $sql = "show create table `" . $val . "`";
            $res = Db::query($sql);
            $info = "-- ----------------------------\r\n";
            $info .= "-- Table structure for `" . $val . "`\r\n";
            $info .= "-- ----------------------------\r\n";
            $info .= "DROP TABLE IF EXISTS `" . $val . "`;\r\n";
            $sqlStr = $info . $res[0]['Create Table'] . ";\r\n\r\n";
            //追加到文件
            file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
        }

//将每个表的数据导出到文件
        foreach ($tabList as $val) {
            $sql = "select * from `" . $val . "`";
            $res = Db::query($sql);
            //如果表中没有数据,则跳出循环
            if (count($res) < 1) continue;
            $info = "-- ----------------------------\r\n";
            $info .= "-- Records for `" . $val . "`\r\n";
            $info .= "-- ----------------------------\r\n";
            file_put_contents($to_file_name, $info, FILE_APPEND);
            //读取数据
            foreach ($res as $v) {
                $sqlStr = "INSERT INTO `" . $val . "` VALUES (";
                foreach ($v as $zd) {
                    $sqlStr .= "'" . $zd . "', ";
                }
                //去掉最后一个逗号和空格
                $sqlStr = substr($sqlStr, 0, strlen($sqlStr) - 2);
                $sqlStr .= ");\r\n";
                file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
            }

            file_put_contents($to_file_name, "\r\n", FILE_APPEND);
        }

3.PHP恢复

// 连接数据库
        $link=@new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}",$data['DB_USER'],$data['DB_PWD']);
        // 获取错误信息
        $error=$link->connect_error;
        if (!is_null($error)) {
            // 转义防止和alert中的引号冲突
            $error=addslashes($error);
            die("<script>alert('数据库链接失败:$error');history.go(-1)</script>");
        }
        // 设置字符集
        $link->query("SET NAMES 'utf8'");
        $link->server_info>5.0 or die("<script>alert('请将您的mysql升级到5.0以上');history.go(-1)</script>");
        // 创建数据库并选中
        if(!$link->select_db($data['DB_NAME'])){
            $create_sql='CREATE DATABASE IF NOT EXISTS '.$data['DB_NAME'].' DEFAULT CHARACTER SET utf8;';
            $link->query($create_sql) or die('创建数据库失败');
            $link->select_db($data['DB_NAME']);
        }
        // 导入sql数据并创建表
        $bjyadmin_str=file_get_contents('./admin.sql');
        $sql_array=preg_split("/;[\r\n]+/", str_replace('admin_',$data['DB_PREFIX'],$bjyadmin_str));
        foreach ($sql_array as $k => $v) {
            if (!empty($v)) {
                $link->query($v);
            }
        }
        $link->close();

4.thinkphp恢复

          //得到文件路径
        $filename='./updata/'.input('get.filename');
        // 导入sql数据并创建表
        $bjyadmin_str=file_get_contents($filename);
        $sql_array=preg_split("/;[\r\n]+/", $bjyadmin_str);
        foreach ($sql_array as $k => $v) {
            if (!empty($v)) {
                Db::query($v);
            }
        }

标签: php thinkphp