zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

thinkphp备份数据库的方法分享

数据库备份方法 分享 thinkphp
2023-06-13 09:15:39 时间

貌似THINKPHP没有备份数据库的方法,所以我自己写了一个,数据库连接和事务处理用的是pdo,如果有需要的可以联系我,写个mysql或者mysqli的

复制代码代码如下:


<?php
classSqlActionextendsAction{
functionoutsql(){
header(“Content-Type:text/html;charset=utf-8″);
/*用C方法读取数据库配置*/
$host=C(‘DB_HOST");
$db_name=C(‘DB_NAME");
$user=C(‘DB_USER");
$password=C(‘DB_PWD");
/*调用导出数据库的私有方法*/
$outstream=$this->outputSql($host,$dbname,$user,$password);
/*下载导出数据库*/
header(“Content-Disposition:attachment;filename=$dbname.sql”);
echo$outstream;
}
/*
*数据库导出函数outputSql
*用PDO方式导出数据库数据
*$host主机名如localhost
*$dbname数据库名
*$user用户名
*$password密码
*$flag标志位0或10为仅导出数据库结构1为导出数据库结构和数据默认为1
*/
privatefunctionoutputSql($host,$dbname,$user,$password,$flag=1){
try{
$pdo=newPDO(“mysql:host=$host;dbname=$dbname”,$user,$password);//连接数据库
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置调优参数,遇到错误抛出异常
}catch(PDOException$e){
echo$e->getMessage();//如果连接异常则抛出错误信息
exit;
}
$mysql=“DROPDATABASEIFEXISTS`$dbname`;\n”;//$mysql装载sql语句,这里如果存在数据库则drop该数据库
$creat_db=$pdo->query(“showcreatedatabase$dbname”)->fetch();//用showcreatedatabase查看sql语句
preg_match(‘/DEFAULTCHARACTERSET(.*)\*/",$creat_db[‘CreateDatabase"],$matches);//正则取出DEFAULTCHARACTERSET后面的字符集
$mysql.=”CREATEDATABASE`$dbname`DEFAULTCHARACTERSET$matches[1]”;//该语句如CREATEDATABASE`test_db`DEFAULTCHARACTERSETutf8
/*查找该数据库的字符整序如COLLATEutf8_general_ci*/
$db_collate=$pdo->query(“SELECTDEFAULT_COLLATION_NAMEFROMinformation_schema.SCHEMATAWHERESCHEMA_NAME="$dbname"LIMIT1″)->fetch();
$mysql.=”COLLATE“.$db_collate[‘DEFAULT_COLLATION_NAME"].”;\nUSE`$dbname`;\n\n”;
$statments=$pdo->query(“showtables”);//返回结果集,showtables检视所有表名
foreach($statmentsas$value){//遍历此结果集,导出每个表名对应的信息
$table_name=$value[0];//获取该表名
$mysql.=”DROPTABLEIFEXISTS`$table_name`;\n”;//每个表前都准备Drop语句
$table_query=$pdo->query(“showcreatetable`$table_name`”);//取出该表建表信息的结果集
$create_sql=$table_query->fetch();//利用fetch方法取出该结果集对应的数组
$mysql.=$create_sql[‘CreateTable"].“;\r\n\r\n”;//写入建表信息
if($flag!=0){//如果标志位不是0则继续取出该表内容生成insert语句
$iteams_query=$pdo->query(“select*from`$table_name`”);//取出该表所有字段结果集
$values=“”;//准备空字符串装载insertvalue值
$items=“”;//准备空字符串装载该表字段名
while($item_query=$iteams_query->fetch(PDO::FETCH_ASSOC)){//用关联查询方式返回表中字段名和值的数组
$item_names=array_keys($item_query);//取出该数组键值即字段名
$item_names=array_map(“addslashes”,$item_names);//将特殊字符转译加\
$items=join(‘`,`",$item_names);//联合字段名如:items1`,`item2`符号为反引号键盘1旁边字段名用反引号括起
$item_values=array_values($item_query);//取出该数组值即字段对应的值
$item_values=array_map(“addslashes”,$item_values);//将特殊字符转译加\
$value_string=join(“‘,"”,$item_values);//联合值如:value1′,"value2值用单引号括起
$value_string=“(‘”.$value_string.“‘),”;//值两边加括号
$values.=”\n”.$value_string;//最后返回给$value
}
if($values!=“”){//如果$values不为空,即该表有内容
//写入insert语句
$insert_sql=“INSERTINTO`$table_name`(`$items`)VALUES”.rtrim($values,“,”).“;\n\r”;
//将该语句写入$mysql
$mysql.=$insert_sql;
}
}

}
return$mysql;
}
}
?>

是不是很实用的功能呢,小伙伴们可以直接移植到自己的项目中去的。