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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
因str_replace导致的注入问题总结
Aug 08 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-redis中文文档介绍
2013/02/07 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
从零学Python之引用和类属性的初步理解
2014/05/15 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python写入文件自动换行问题的方法
2019/07/05 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
Python实现GIF图倒放
2020/07/16 Python
详解python with 上下文管理器
2020/09/02 Python
Pycharm Git 设置方法
2020/09/15 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
九年级化学教学反思
2014/01/28 职场文书
签约仪式主持词
2014/03/19 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
Django路由层如何获取正确的url
2021/07/15 Python