thinkphp备份数据库的方法分享


Posted in PHP onJanuary 04, 2015

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

<?php

class SqlAction extends Action{

function outsql(){

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或1 0为仅导出数据库结构 1为导出数据库结构和数据 默认为1

*/

private function outputSql($host, $dbname, $user, $password, $flag=1) {

try {

$pdo = new PDO(“mysql:host=$host;dbname=$dbname”, $user, $password); //连接数据库

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //设置调优参数,遇到错误抛出异常

} catch (PDOException $e) {

echo $e->getMessage(); //如果连接异常则抛出错误信息

exit;

}

$mysql = “DROP DATABASE IF EXISTS `$dbname`;\n”; //$mysql装载sql语句,这里如果存在数据库则drop该数据库

$creat_db=$pdo->query(“show create database $dbname”)->fetch();//用show create database查看sql语句

preg_match(‘/DEFAULT CHARACTER SET(.*)\*/', $creat_db[‘Create Database'],$matches);//正则取出DEFAULT CHARACTER SET 后面的字符集

$mysql.=”CREATE DATABASE `$dbname` DEFAULT CHARACTER SET $matches[1]”;//该语句如CREATE DATABASE `test_db` DEFAULT CHARACTER SET utf8

/*查找该数据库的字符整序如COLLATE utf8_general_ci*/

$db_collate=$pdo->query(“SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME ='$dbname' LIMIT 1″)->fetch();

$mysql.=”COLLATE “.$db_collate[‘DEFAULT_COLLATION_NAME'].”;\nUSE `$dbname`;\n\n”;

$statments = $pdo->query(“show tables”); //返回结果集,show tables检视所有表名

foreach ($statments as $value) {//遍历此结果集,导出每个表名对应的信息

$table_name = $value[0]; //获取该表名

$mysql.=”DROP TABLE IF EXISTS `$table_name`;\n”; //每个表前都准备Drop语句

$table_query = $pdo->query(“show create table `$table_name`”); //取出该表建表信息的结果集

$create_sql = $table_query->fetch(); //利用fetch方法取出该结果集对应的数组

$mysql.=$create_sql[‘Create Table'] . “;\r\n\r\n”; //写入建表信息

if ($flag != 0) {//如果标志位不是0则继续取出该表内容生成insert语句

$iteams_query = $pdo->query(“select * from `$table_name`”); //取出该表所有字段结果集

$values = “”; //准备空字符串装载insert value值

$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 = “INSERT INTO `$table_name` (`$items`) VALUES” . rtrim($values, “,”) . “;\n\r”;

//将该语句写入$mysql

$mysql.=$insert_sql;

}

}
}

return $mysql;

}

}

?>

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

PHP 相关文章推荐
PHP的FTP学习(四)
Oct 09 PHP
文件上传程序的全部源码
Oct 09 PHP
php include和require的区别深入解析
Jun 17 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
php实现Mysql简易操作类
Oct 11 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 #PHP
php+mysql实现用户注册登陆的方法
Jan 03 #PHP
php静态文件生成类实例分析
Jan 03 #PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 #PHP
php中socket通信机制实例详解
Jan 03 #PHP
php读取csv数据保存到数组的方法
Jan 03 #PHP
php获取用户浏览器版本的方法
Jan 03 #PHP
You might like
PHP速成大法
2015/01/30 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
js constructor的实际作用分析
2011/11/15 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
js实现tab切换效果
2017/02/16 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
python difflib模块示例讲解
2017/09/13 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
Python常用库大全及简要说明
2020/01/17 Python
如何用Python 加密文件
2020/09/10 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python 如何引入协程和原理分析
2020/11/30 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
经贸日语毕业生自荐信
2013/11/03 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
营业用房租赁协议书
2014/11/26 职场文书