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中获得视频时间总长度的另一种方法
Sep 15 PHP
PHP安全配置详细说明
Sep 26 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
php制作的简单验证码识别代码
Jan 26 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
PHP中函数gzuncompress无法使用的解决方法
Mar 02 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 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
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php编程每天必学之表单验证
2016/03/01 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
网站开发实习生的自我评价
2013/12/11 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
招标承诺书
2014/08/30 职场文书
施工员岗位职责
2015/02/10 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js