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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
PHP 和 COM
Oct 09 PHP
PHP实现分页的一个示例
Oct 09 PHP
php 结果集的分页实现代码
Mar 10 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
CodeIgniter扩展核心类实例详解
Jan 20 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
vue全局使用axios的操作
2020/09/08 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python 计算文件的md5值实例
2017/01/13 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
Python如何实现邮件功能
2020/05/27 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
优秀士兵先进事迹
2014/02/06 职场文书
五年级音乐教学反思
2014/02/06 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
MySQL锁机制
2021/04/05 MySQL
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
python实现学生信息管理系统(面向对象)
2022/06/05 Python