php备份和恢复源码,PHP数据库备份还原类

php代码<?php

/**

* 数据库备份还原类

* @author xialeistudio* @date 2014-03-17

* Class DatabaseTool

*/

class DatabaseTool

{

private $handler;

private $config = array(

'host' => 'localhost',

'port' => 3306,

'user' => 'root',

'password' => '',

'database' => 'test',

'charset' => 'utf8',

'target' => 'sql.sql'

);

private $tables = array();

private $error;

private $begin; //开始时间

/**

* 架构方法

* @param array $config

*/

public function __construct($config = array())

{

$this->begin = microtime(true);

$config = is_array($config) ? $config : array();

$this->config = array_merge($this->config, $config);

//启动PDO连接

try

{

$this->handler = new PDO("mysql:host={$this->config['host']}:{$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);

}

catch (PDOException $e)

{

$this->error = $e->getMessage();

return false;

}

catch (Exception $e)

{

$this->error = $e->getMessage();

return false;

}

}

/**

* 备份

* @param array $tables

* @return bool

*/

public function backup($tables = array())

{

//存储表定义语句的数组

$ddl = array();

//存储数据的数组

$data = array();

$this->setTables($tables);

if (!empty($this->tables))

{

foreach ($this->tables as $table)

{

$ddl[] = $this->getDDL($table);

$data[] = $this->getData($table);

}

//开始写入

$this->writeToFile($this->tables, $ddl, $data);

}

else

{

$this->error = '数据库中没有表!';

return false;

}

}

/**

* 设置要备份的表

* @param array $tables

*/

private function setTables($tables = array())

{

if (!empty($tables) && is_array($tables))

{

//备份指定表

$this->tables = $tables;

}

else

{

//备份全部表

$this->tables = $this->getTables();

}

}

/**

* 查询

* @param string $sql

* @return mixed

*/

private function query($sql = '')

{

$stmt = $this->handler->query($sql);

$stmt->setFetchMode(PDO::FETCH_NUM);

$list = $stmt->fetchAll();

return $list;

}

/**

* 获取全部表

* @return array

*/

private function getTables()

{

$sql = 'SHOW TABLES';

$list = $this->query($sql);

$tables = array();

foreach ($list as $value)

{

$tables[] = $value[0];

}

return $tables;

}

/**

* 获取表定义语句

* @param string $table

* @return mixed

*/

private function getDDL($table = '')

{

$sql = "SHOW CREATE TABLE `{$table}`";

$ddl = $this->query($sql)[0][1] . ';';

return $ddl;

}

/**

* 获取表数据

* @param string $table

* @return mixed

*/

private function getData($table = '')

{

$sql = "SHOW COLUMNS FROM `{$table}`";

$list = $this->query($sql);

//字段

$columns = '';

//需要返回的SQL

$query = '';

foreach ($list as $value)

{

$columns .= "`{$value[0]}`,";

}

$columns = substr($columns, 0, -1);

$data = $this->query("SELECT * FROM `{$table}`");

foreach ($data as $value)

{

$dataSql = '';

foreach ($value as $v)

{

$dataSql .= "'{$v}',";

}

$dataSql = substr($dataSql, 0, -1);

$query .= "INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\r\n";

}

return $query;

}

/**

* 写入文件

* @param array $tables

* @param array $ddl

* @param array $data

*/

private function writeToFile($tables = array(), $ddl = array(), $data = array())

{

$str = "/*\r\nMySQL Database Backup Tools\r\n";

$str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n";

$str .= "Database:{$this->config['database']}\r\n";

$str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n";

$str .= "SET FOREIGN_KEY_CHECKS=0;\r\n";

$i = 0;

foreach ($tables as $table)

{

$str .= "-- ----------------------------\r\n";

$str .= "-- Table structure for {$table}\r\n";

$str .= "-- ----------------------------\r\n";

$str .= "DROP TABLE IF EXISTS `{$table}`;\r\n";

$str .= $ddl[$i] . "\r\n";

$str .= "-- ----------------------------\r\n";

$str .= "-- Records of {$table}\r\n";

$str .= "-- ----------------------------\r\n";

$str .= $data[$i] . "\r\n";

$i++;

}

echo file_put_contents($this->config['target'], $str) ? '备份成功!花费时间' . (microtime(true) - $this->begin) . 'ms' : '备份失败!';

}

/**

* 错误信息

* @return mixed

*/

public function getError()

{

return $this->error;

}

public function restore($path = '')

{

if (!file_exists($path))

{

$this->error('SQL文件不存在!');

return false;

}

else

{

$sql = $this->parseSQL($path);

try

{

$this->handler->exec($sql);

echo '还原成功!花费时间', (microtime(true) - $this->begin) . 'ms';

}

catch (PDOException $e)

{

$this->error = $e->getMessage();

return false;

}

}

}

/**

* 解析SQL文件为SQL语句数组

* @param string $path

* @return array|mixed|string

*/

private function parseSQL($path = '')

{

$sql = file_get_contents($path);

$sql = explode("\r\n", $sql);

//先消除--注释

$sql = array_filter($sql, function ($data)

{

if (empty($data) || preg_match('/^--.*/', $data))

{

return false;

}

else

{

return true;

}

});

$sql = implode('', $sql);

//删除/**/注释

$sql = preg_replace('/\/\*.*\*\//', '', $sql);

return $sql;

}

}

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2011年Android手机用户购买行为研究报告

http://mobile.51cto.com/hot-292153.htm转载于:https://blog.51cto.com/jueshishenhua/670081

以IP段作为监听地址

在写Socket通讯服务的时候一般需要Listen某个IP地址端口&#xff0c;但这样比较麻烦的就是部署后需要配置相关IP地址信息&#xff1b;虽然可以监听Any所有地址&#xff0c;但这种对于私有的网络服务来说并不安全。为了在发布的时候节省一些配置工作所以才想到以IP段作为监听地址…

支付宝 统一支付 php,支付宝APP支付 统一下单 php服务端 tp5

{$data input(‘post.‘);Loader::import(‘/alipay/aop/AopClient‘,EXTEND_PATH);$aop new \AopClient();$aop->appId config("alipay_app_id");$aop->rsaPrivateKey config(‘alipay_private_key‘);$aop->alipayrsaPublicKey config(‘alipay_publ…

近期资料分享汇总,还不快来看看你漏了哪份没拿?

相信&#xff0c;一直关注着我们的同学们都知道&#xff0c;小思妹分享了好多好多的资料给大家。为了方便新来的同学自取&#xff0c;小思妹又重新整理了一遍&#xff0c;直接点以下标题即可跳转&#xff01;这是我见过的最全的训练数据集&#xff0c;没有之一&#xff01;送你…

WebView 访问 url asset sd 网页

引用&#xff1a;http://www.oschina.net/code/snippet_54100_6227 [代码] [Java]代码 01//打开本包内asset目录下的index.html文件02 03wView.loadUrl(" file:///android_asset/index.html "); 04 05//打开本地sd卡内的index.html文件06 07wView.loadUrl("con…

oracle天数加个随机数,如何给一个表某列加上指定的随机数

如何给一个表某列加上指定的随机数一、原始数据create table #test (name varchar(10),ddate datetime,date1 datetime,date2 datetime)insert into #testselect 张三,2013-09-01,2013-09-01 09:00:00.000,2013-09-01 17:00:00.000 union allselect 张三,2013-09-02,2013-09-0…

MS Learn 宝藏资源库 - 学习经验分享

点击蓝字关注我们作者&#xff1a;刘轶民大家好&#xff0c;我是东北电力大学的一名在校学生&#xff0c;我叫刘轶民&#xff0c;很高兴能以 MS Learn 的受益者的身份&#xff0c;来分享一些经验与看法。作为正在上学的我来讲&#xff0c;很多时候我可能更多的去面临着新技术的…

你必须知道的28个HTML5特征、窍门和技术

Jeffrey Way曾发表过一篇博文《28 HTML5 Features, Tips, and Techniques you Must Know 》讲述了28个HTML5特征、窍门和技术&#xff0c;张鑫旭将本文进行了翻译&#xff0c;现转载于此&#xff0c;全文如下&#xff1a;前端的发展如此之迅猛&#xff0c;一不留神&#xff0c;…

一起读懂传说中的经典:受限玻尔兹曼机

尽管性能没有流行的生成模型好&#xff0c;但受限玻尔兹曼机还是很多读者都希望了解的内容。这不仅是因为深度学习的复兴很大程度上是以它为前锋&#xff0c;同时它那种逐层训练与重构的思想也非常有意思。本文介绍了什么是受限玻尔兹曼机&#xff0c;以及它的基本原理&#xf…

NET问答: 发布 asp.net core 时如何修改 ASPNETCORE_ENVIRONMENT 环境变量?

咨询区 Dario&#xff1a;当我把 asp.net core web 发布到本地文件时&#xff0c;我发现程序读的是 appsettings.Production.json ,也就说明当前的 ASPNETCORE_ENVIRONMENT Production。请问如何动态修改 ASPNETCORE_ENVIRONMENT 的值&#xff0c;这样的话在 调试 和 发布 阶段…

oracle 如何筛选重复,求sql--筛选A字段相同,B字段不同且不重复的记录

测试数据&#xff1a;create table PRICE(ID VARCHAR2(10),PRICE NUMBER,SYSID VARCHAR2(10));insert into price (ID, PRICE, SYSID)values (10, 1000, 1);insert into price (ID, PRICE, SYSID)values (10, 1000, 2);insert into price (ID, PRICE, SYSID)values (20, 200…

注释里的诅咒:哪种语言遭受最多的咒骂?

导读&#xff1a;原文作者Scott Gilbertson在webmonkey.com发表一篇《Cussing in Commits: Which Programming Language Inspires the Most Swearing?》&#xff0c;由外刊IT评论整理翻译《注释里的诅咒&#xff1a;哪种语言遭受最多的咒骂&#xff1f;》。内容如下:任何一个程…

php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云

## 定义ThinkPHP3.2版本提供了把每个操作方法定位到一个类的功能&#xff0c;可以让你的开发工作更细化&#xff0c;可以设置参数**ACTION_BIND_CLASS**&#xff0c;例如&#xff1a;~~~ACTION_BIND_CLASS > True,~~~设置后&#xff0c;我们的控制器定义有所改变&#xff0c…

怎样快速掌握深度学习TensorFlow框架?

TensorFlow是Google基于DistBelief进行研发的第二代人工智能学习系统&#xff0c;其命名来源于本身的运行原理。Tensor&#xff08;张量&#xff09;意味着N维数组&#xff0c;Flow&#xff08;流&#xff09;意味着基于数据流图的计算&#xff0c;TensorFlow实际上就是张量从流…

牛X,.NET6又双叒叕新版本,这是要起飞吗?

.NET6又双叒叕出新版本了&#xff0c;2月17号Preview1、3月11号Preview2、4月8号又Preview3了&#xff0c;密集的版本发布&#xff0c;各种新技术和改进优化&#xff0c;不禁要问一句&#xff0c;.NET6是要起飞吗&#xff1f;下面给大家科普下.NET6将带来的几大核心变化&#x…

外媒:谷歌攻击码由中国作者发布

英国金融时报&#xff08;The Financial Times&#xff09;报导&#xff0c;一名中国的自由安全顾问&#xff0c;撰写了利用IE6浏览器的攻击代码&#xff0c;而后被用来攻击谷歌等美国公司。 根据金融时报的报导&#xff0c;这名身份尚未曝光的程序设计师&#xff0c;将部分攻击…

用python挖一挖知乎上宅男们最喜欢的1000个妹子

在文章开始前&#xff0c;先来一张图给大家热热身。这里是宅男们最喜欢的妹子中排名前200位的头像&#xff08;实际193张图&#xff0c;部分不规则的图已被二胖过滤&#xff09;。排名不分先后哈&#xff01;快来看看有没有你们熟悉的面孔。找到眼熟的人了吗&#xff1f;说不定…

在 .NET 6 Preview 3 ASP.NET Core 更新

.NET 6 Preview 3现在可用了&#xff0c;其中包括对ASP.NET Core的许多重大改进。这是此预览版本中的新增功能&#xff1a;更小的SignalR&#xff0c;Blazor Server和MessagePack scripts启用 Redis 分析会话HTTP/3 endpoint TLS配置初版的 .NET Hot Reload 支持Razor编译器不再…

matlab求滤波器的冲激响应,在TMS320C5410上用MATLAB实现有限冲激响应滤波器

在TMS320C5410上用MATLAB实现有限冲激响应滤波器许辉;许红【期刊名称】《计算机应用与软件》【年(卷),期】2003(020)007【摘要】介绍在TMS320C5410上尝试MATLAB语言编程实现FIR数字滤波器的方案,阐明其开发基本原理,并给出了具体程序实例.【总页数】3页(41-42,79)【关键词】数字…

单点登录在项目中的实现 转.

最近在做一个登录功能&#xff0c;纠结了好几天&#xff0c;一直在找一个能优雅的实现单点登录的功能。博客园有看到某人写了又臭又长的八股文式的文章&#xff0c;没看到有价值的东西。 其实单点登录最终要解决的是多个不同域名间共享cookie的问题。但是要在不同域名间共享coo…