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 4.2书写安全的脚本
Oct 09 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
Feb 08 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
详解thinkphp中的volist标签
Jan 15 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
php中pcntl_fork详解
Apr 01 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/08/13 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python语言描述最大连续子序列和
2017/12/05 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python使用requests.session模拟登录
2019/08/09 Python
如何基于Python批量下载音乐
2019/11/11 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python将图片转base64,实现前端显示
2020/01/09 Python
python实现udp传输图片功能
2020/03/20 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
学校校庆演讲稿
2014/05/22 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
信仰心得体会
2014/09/05 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers