首页 编程设计PHP正文

php实现数据库备份与导入代码

云水 PHP 2021-10-14 10:34:53 137 0 sqlphp

利用宝塔面板的计划任务,可以实现对数据库的备份。主要代码如下:

//数据库配置
$host="";
$user="";
$password="";
$dbname="";

$fileaddr = ""; //备份数据库存放路径

$conn = mysqli_connect($host, $user, $password);
// 这里的账号、密码、名称都是从页面传过来的
if (!$conn){ // 连接mysql数据库
    echo '数据库连接失败,请核对后再试';
    exit;
} 
if (!mysqli_select_db($conn,$dbname)){ // 是否存在该数据库
    echo '不存在数据库:' . $dbname . ',请核对后再试';
    exit;
    } 

if($type === 'backup'){
    mysqli_query($conn,"set names 'utf8'");
    $mysql = "set charset utf8;\r\n";
    $q1 = mysqli_query($conn,"show tables");
    while ($t = mysqli_fetch_array($q1)){
      $table = $t[0];
      $q2 = mysqli_query($conn,"show create table `$table`");
      $sql = mysqli_fetch_array($q2);
      $mysql .= $sql['Create Table'] . ";\r\n";
      $q3 = mysqli_query($conn,"select * from `$table`");
      while ($data = mysqli_fetch_assoc($q3)){
        $keys = array_keys($data);
        $keys = array_map('addslashes', $keys);
        $keys = join('`,`', $keys);
        $keys = "`" . $keys . "`";
        $vals = array_values($data);
        $vals = array_map('addslashes', $vals);
        $vals = join("','", $vals);
        $vals = "'" . $vals . "'";
        $mysql .= "insert into `$table`($keys) values($vals);\r\n";
      } 
    } 
    //$filename1 = $dbname . date('Ymdhis') . ".sql";
    $filename1 = $dbname . ".sql";
    $filename = $fileaddr.$filename1; 
    
    $fp = fopen($filename, 'w');
    fputs($fp, $mysql);
    fclose($fp);
    echo "数据备份成功";
}elseif($type === 'import'){
    $filestr = "sql";
    $keywords= "jz";
    $add = read_all($filestr,$keywords);
    $count = sizeof($add);
    $myarr = array();
    for ($x=0; $x<$count; $x++) {
      $myarr[]=str_replace(".sql","",str_replace($fileaddr,"",$add[$x]));
    } 
    $max = max($myarr);
    $newadr = "jz" . $max . ".sql";
    $file_name = $fileaddr.$newadr;
    echo $file_name;
    set_time_limit(0);
    $fp = @fopen($file_name, "r") or die("不能打开SQL文件 $file_name");//打开文件
    
    echo "<p>正在清空数据库,请稍等....<br>";
    $result = mysqli_query($conn,"SHOW tables");
    while ($currow=mysqli_fetch_array($result)){
        mysqli_query($conn,"drop TABLE IF EXISTS $currow[0]");
        echo "清空数据表【".$currow[0]."】成功!<br>";
    }
    echo "<br>恭喜你清理MYSQL成功<br>";
    
    echo "正在执行导入数据库操作<br>";
    // 导入数据库的MySQL命令
    $order = "mysql -u".$user." -p".$password." ".$dbname." < ".$file_name ;
    //echo $order;
    exec($order);
    echo "<br>导入完成!";
    mysqli_close($conn);
    
}

/*
 * 遍历文件夹下所有文件
 */
function read_all($dir,$keywords){
    $address = array();
    if(!is_dir($dir)) return false;

    $handle = opendir($dir);
    if($handle){
        while(($fl = readdir($handle)) !== false){
             $temp = $dir.DIRECTORY_SEPARATOR.$fl;
             //如果不加  $fl!='.' && $fl != '..'  则会造成把$dir的父级目录也读取出来
             if(is_dir($temp) && $fl!='.' && $fl != '..'){
                 //echo '目录:'.$temp.'<br>';
                 //read_all($temp);
                 $address[] = $temp ;
             }else{
                 if($fl!='.' && $fl != '..'){
                     //检查文件名是否以‘$keywords’开头
                     if(strpos($fl, $keywords) === 0){
                        $address[] = $temp ;
                     }
                 }else{
                    $address = null;  
                 }
             }
         }
     }else{
        $address = null; 
     }
     return $address;
 }

注意,在使用导入功能时,需要php开启exec功能(默认是不能开启的,具体百度一下),而且windows环境和linux环境使用的mysql命令是不一样的。

如果有什么问题,欢迎在下方留言!!

版权声明

1.本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2.本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3.若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
4.若内容涉及侵权或违法信息,请联系本站管理员进行下架处理,邮箱ganice520@163.com(本站不支持其他投诉反馈渠道,谢谢合作)

本文链接:http://apod.cc/index.php/post/622.html

发表评论

评论列表(0人评论 , 137人围观)
☹还没有评论,来说两句吧...