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中使用与Perl兼容的正则表达式
Nov 26 PHP
PHPwind整合最土系统用户同步登录实现方法
Dec 08 PHP
php 操作符与控制结构
Mar 07 PHP
PHP异常处理Exception类
Dec 11 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 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中文乱码问题的终极解决方案汇总
2017/08/01 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python实现简单爬虫功能的示例
2016/10/24 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
python3.6实现学生信息管理系统
2019/02/21 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
详解Python3中的 input() 函数
2020/03/18 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
安全教育心得体会
2013/12/29 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
十八大观后感
2015/06/12 职场文书
教师节表彰会主持词
2015/07/06 职场文书
二十年同学聚会感言
2015/07/30 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js