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 相关文章推荐
15种PHP Encoder的比较
Apr 17 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
Sep 19 PHP
php设置编码格式的方法
Mar 05 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
如何使用PHP给图片加水印
Oct 12 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Laravel如何同时连接多个数据库详解
Aug 13 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图片验证码代码
2008/03/27 PHP
Admin generator, filters and I18n
2011/10/06 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
js数组去重的hash方法
2016/12/22 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
python的schedule定时任务模块二次封装方法
2019/02/19 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
dpn网络的pytorch实现方式
2020/01/14 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
一套Delphi的笔试题一
2016/02/14 面试题
信用卡结清证明怎么写
2014/09/13 职场文书
python三子棋游戏
2022/05/04 Python