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动态图像的创建
Oct 09 PHP
默默简单的写了一个模板引擎
Jan 02 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
PHP打印输出函数汇总
Aug 28 PHP
PHP后期静态绑定实例浅析
Dec 21 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实现采集程序原理和简单示例代码
2007/03/18 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
python opencv之SURF算法示例
2018/02/24 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
什么是索引指示器
2012/08/20 面试题
学风建设主题班会
2015/08/17 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript