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_xmlhttp 乱码问题解决方法
Aug 07 PHP
PHP 文件上传全攻略
Apr 28 PHP
基于PHP magic_quotes_gpc的使用方法详解
Jun 24 PHP
PHP与MYSQL中UTF8 中文排序示例代码
Oct 23 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
php结合curl实现多线程抓取
Jul 09 PHP
解决php表单重复提交实现方法
Sep 29 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
php实现的mongoDB单例模式操作类
Jan 20 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP中的自动加载操作实现方法详解
Aug 06 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实现邮件群发的源码
2013/06/18 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
实例浅析js的this
2016/12/11 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
Python的Lambda函数用法详解
2019/09/03 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
Servlet方面面试题
2016/09/28 面试题
小学教师的自我评价范例
2013/10/31 职场文书
音乐教学案例
2014/01/30 职场文书
一年级班主任感言
2014/03/08 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
工地安全生产标语
2014/06/06 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
音乐剧猫观后感
2015/06/04 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python