thinkphp备份数据库的方法分享
貌似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; } } ?>