<?php /** * 创建时间: 2012年5月21日 * * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql) * 功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入 * 使用方法: * * ------1. 数据库备份(导出)------------------------------------------------------------ //分别是主机,用户名,密码,数据库名,数据库编码 $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); // 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) $db->backup (); * ------2. 数据库恢复(导入)------------------------------------------------------------ //分别是主机,用户名,密码,数据库名,数据库编码 $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); //参数:sql文件 $db->restore ( './backup/20120516211738_all_v1.sql'); *---------------------------------------------------------------------- */ class DBManage { var $db; // 数据库连接 var $database; // 所用数据库 var $sqldir; // 数据库备份文件夹 var $record; // 换行符 private $ds = "\n"; // 存储SQL的变量 public $sqlContent = ""; // 每条sql语句的结尾符 public $sqlEnd = ";"; /** * 初始化 * * @param string $host * @param string $username * @param string $password * @param string $thisatabase * @param string $charset */ function __construct($host = 'localhost', $username = 'root', $password = '', $thisatabase = 'test', $charset = 'utf8') { $this->host = $host; $this->username = $username; $this->password = $password; $this->database = $thisatabase; $this->charset = $charset; // 连接数据库 $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." ); // 选择使用哪个数据库 mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" ); // 数据库编码方式 mysql_query ( 'SET NAMES ' . $this->charset, $this->db ); } /* * ------------------------------------------数据库备份start---------------------------------------------------------- */ /** * 数据库备份 * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) * * @param $string $dir * @param int $size * @param $string $tablename */ function backup($tablename = '', $dir, $size) { $dir = $dir ? $dir : 'backup/'; $size = $size ? $size : 2000; $sql = ''; // 只备份某个表 if (! empty ( $tablename )) { echo '正在备份表' . $tablename . '<br />'; // 插入dump信息 $sql = $this->_retrieve(); // 插入表结构信息 $sql .= $this->_insert_table_structure ( $tablename ); // 插入数据 $data = mysql_query ( "select * from " . $tablename ); // 文件名前面部分 $filename = date ( 'YmdHis' ) . "_" . $tablename; // 字段数量 $num_fields = mysql_num_fields ( $data ); // 第几分卷 $p = 1; // 循环每条记录 while ( $record = mysql_fetch_array ( $data ) ) { // 单条记录 $sql .= $this->_insert_record ( $tablename, $num_fields, $record ); // 如果大于分卷大小,则写入文件 if (strlen ( $sql ) >= $size * 1000) { $file = $filename . "_v" . $p . ".sql"; if ($this->_write_file ( $sql, $file, $dir )) { echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />"; } else { echo "备份表-" . $tablename . "-失败<br />"; } // 下一个分卷 $p ++; // 重置$sql变量为空,重新计算该变量大小 $sql = ""; } } // sql大小不够分卷大小 if ($sql != "") { $filename .= "_v" . $p . ".sql"; if ($this->_write_file ( $sql, $filename, $dir )) { echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />"; } else { echo "备份卷-" . $p . "-失败<br />"; } } } else { // 备份全部表 if ($tables = mysql_query ( "show table status from " . $this->database )) { echo "读取数据库结构成功!<br />"; } else { exit ( "读取数据库结构成功!<br />" ); } // 插入dump信息 $sql .= $this->_retrieve(); // 文件名前面部分 $filename = date ( 'YmdHis' ) . "_all"; // 查出所有表 $tables = mysql_query ( 'SHOW TABLES' ); // 第几分卷 $p = 1; // 循环所有表 while ( $table = mysql_fetch_array ( $tables ) ) { // 获取表名 $tablename = $table [0]; // 获取表结构 $sql .= $this->_insert_table_structure ( $tablename ); $data = mysql_query ( "select * from " . $tablename ); $num_fields = mysql_num_fields ( $data ); // 循环每条记录 while ( $record = mysql_fetch_array ( $data ) ) { // 单条记录 $sql .= $this->_insert_record ( $tablename, $num_fields, $record ); // 如果大于分卷大小,则写入文件 if (strlen ( $sql ) >= $size * 1000) { $file = $filename . "_v" . $p . ".sql"; // 写入文件 if ($this->_write_file ( $sql, $file, $dir )) { echo "-卷-" . $p . "-数据备份完成,生成备份文件<span style='color:#f00;'>$dir$file</span><br />"; } else { echo "备份卷-" . $p . "-失败<br />"; } // 下一个分卷 $p ++; // 重置$sql变量为空,重新计算该变量大小 $sql = ""; } } } // sql大小不够分卷大小 if ($sql != "") { $filename .= "_v" . $p . ".sql"; if ($this->_write_file ( $sql, $filename, $dir )) { echo "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename<br />"; } else { echo "备份卷-" . $p . "-失败<br />"; } } } } /** * 插入数据库备份基础信息 * * @return string */ private function _retrieve() { $value = ''; $value .= '--' . $this->ds; $value .= '-- MySQL database dump' . $this->ds; $value .= '-- Created by DBManage class, Power By yanue. ' . $this->ds; $value .= '-- http://yanue.net ' . $this->ds; $value .= '--' . $this->ds; $value .= '-- 主机: ' . $this->host . $this->ds; $value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年 ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds; $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds; $value .= '-- PHP 版本: ' . phpversion () . $this->ds; $value .= $this->ds; $value .= '--' . $this->ds; $value .= '-- 数据库: `' . $this->database . '`' . $this->ds; $value .= '--' . $this->ds . $this->ds; $value .= '-- -------------------------------------------------------'; $value .= $this->ds . $this->ds; return $value; } /** * 插入表结构 * * @param unknown_type $table * @return string */ private function _insert_table_structure($table) { $sql = ''; $sql .= "--" . $this->ds; $sql .= "-- 表的结构" . $table . $this->ds; $sql .= "--" . $this->ds . $this->ds; // 如果存在则删除表 $sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds; // 获取详细表信息 $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' ); $row = mysql_fetch_array ( $res ); $sql .= $row [1]; $sql .= $this->sqlEnd . $this->ds; // 加上 $sql .= $this->ds; $sql .= "--" . $this->ds; $sql .= "-- 转存表中的数据 " . $table . $this->ds; $sql .= "--" . $this->ds; $sql .= $this->ds; return $sql; } /** * 插入单条记录 * * @param string $table * @param int $num_fields * @param array $record * @return string */ private function _insert_record($table, $num_fields, $record) { // sql字段逗号分割 $insert = $comma = ""; $insert .= "INSERT INTO `" . $table . "` VALUES("; // 循环每个子段下面的内容 for($i = 0; $i < $num_fields; $i ++) { $insert .= ($comma . "'" .mysql_real_escape_string ( $record [$i] ) . "'"); $comma = ","; } $insert .= ");" . $this->ds; return $insert; } /** * 写入文件 * * @param string $sql * @param string $filename * @param string $dir * @return boolean */ private function _write_file($sql, $filename, $dir) { $dir = $dir ? $dir : './backup/'; // 不存在文件夹则创建 if (! file_exists ( $dir )) { mkdir ( $dir ); } $re = true; if (! @$fp = fopen ( $dir . $filename, "w+" )) { $re = false; echo "打开文件失败!"; } if (! @fwrite ( $fp, $sql )) { $re = false; echo "写入文件失败,请文件是否可写"; } if (! @fclose ( $fp )) { $re = false; echo "关闭文件失败!"; } return $re; } /* * * -------------------------------上:数据库导出-----------分割线----------下:数据库导入-------------------------------- */ /** * 导入备份数据 * 说明:分卷文件格式20120516211738_all_v1.sql * 参数:文件路径(必填) * * @param string $sqlfile */ function restore($sqlfile) { // 检测文件是否存在 if (! file_exists ( $sqlfile )) { exit ( "文件不存在!请检查" ); } $this->lock ( $this->database ); // 获取数据库存储位置 $sqlpath = pathinfo ( $sqlfile ); $this->sqldir = $sqlpath ['dirname']; // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷 $volume = explode ( "_v", $sqlfile ); $volume_path = $volume [0]; echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损<br />"; echo "正在导入备份数据,请稍等!<br />"; if (empty ( $volume [1] )) { echo "正在导入sql:<span style='color:#f00;'>" . $sqlfile . '</span><br />'; // 没有分卷 if ($this->_import ( $sqlfile )) { echo "数据库导入成功!"; } else { exit ( '数据库导入失败!' ); } } else { //$volume_id = array(); // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 $volume_id = explode ( ".sq", $volume [1] ); // 当前分卷为$volume_id $volume_id = intval ( $volume_id [0] ); while ( $volume_id ) { $tmpfile = $volume_path . "_v" . $volume_id . ".sql"; // 存在其他分卷,继续执行 if (file_exists ( $tmpfile )) { // 执行导入方法 echo "正在导入分卷$volume_id:<span style='color:#f00;'>" . $tmpfile . '</span><br />'; if ($this->_import ( $tmpfile )) { } else { exit ( "导入分卷$volume_id:<span style='color:#f00;'>" . $tmpfile . '</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); } } else { echo "此分卷备份全部导入成功!<br />"; return; } $volume_id++; } } } /** * 将sql导入到数据库(普通导入) * * @param string $sqlfile * @return boolean */ private function _import($sqlfile) { // sql文件包含的sql语句数组 $sqls = array (); $f = fopen ( $sqlfile, "rb" ); // 创建表缓冲变量 $create = ''; while ( ! feof ( $f ) ) { // 读取每一行sql $line = fgets ( $f ); // 如果包含'-- '等注释,或为空白行,则跳过 if (trim ( $line ) == '' || preg_match ( '/--*?/', $line, $match )) { continue; } // 如果结尾包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句), if (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) { // 将本次sql语句与创建表sql连接存起来 $create .= $line; // 如果包含了创建表的最后一句 if (preg_match ( '/ENGINE=/', $create, $match )) { // 则将其合并到sql数组 $sqls [] = $create; // 清空当前,准备下一个表的创建 $create = ''; } // 跳过本次 continue; } $sqls [] = $line; } fclose ( $f ); // 循环sql语句数组,分别执行 foreach ( $sqls as $sql ) { str_replace ( "\n", "", $sql ); if (! mysql_query ( trim ( $sql ) )) { echo mysql_error (); return false; } } return true; } /* * -------------------------------数据库导入end--------------------------------- */ // 关闭数据库连接 private function close() { mysql_close ( $this->db ); } // 锁定数据库,以免备份或导入时出错 private function lock($tablename, $op = "WRITE") { if (mysql_query ( "lock tables " . $tablename . " " . $op )) return true; else return false; } // 解锁 private function unlock() { if (mysql_query ( "unlock tables" )) return true; else return false; } // 析构 function __destruct() { mysql_query ( "unlock tables", $this->db ); mysql_close ( $this->db ); } }
相关推荐
在PHP开发中,处理Excel文件是一项常见的任务,无论是导入数据到数据库、导出报表还是进行数据分析,PHPExcel库都提供了一种强大而灵活的方式。PHPExcel是一个开源的PHP类库,它允许开发者读取和写入多种不同的Excel...
【标题】:“从phpwind论坛分离出来的mysql数据库导入导出程序源码”是针对PHPWind论坛系统的数据库管理工具,主要用于数据库的备份(导出)和恢复(导入)操作。PHPWind是一款广泛使用的开源社区论坛软件,它基于...
在PHP开发中,处理Excel文件是一项常见的任务,无论是为了数据导入到数据库,还是从数据库导出数据以便用户下载。在本篇文章中,我们将探讨如何利用PHP实现Excel文件的导入和导出,以及如何封装一个简单的Excel类来...
"基于PHP的excel插件支持7.4(操作Excel实现导入导出)"是一个专门针对这些需求的工具,它允许开发者通过PHP来操作Microsoft Excel文件,从而实现数据的导入和导出功能。 首先,我们需要理解PHP如何与Excel文件交互。...
本篇文章将详细讲解如何使用PHP处理CSV文件的导入与导出,以及如何通过类封装来实现这一功能。 一、CSV文件格式 CSV文件是以逗号分隔的数据格式,每一行代表一个记录,每个字段之间用逗号分隔。这种格式易于读写,...
在PHP开发中,处理Excel文件是一项常见的任务,无论是从网页中导出数据到Excel文件,还是从Excel文件导入数据到数据库。"php excel导出 导入"这个主题涵盖了一系列的技术点,包括如何使用PHP与Excel文件进行交互。...
在PHP开发中,处理Excel文件是一项常见的任务,无论是从用户上传的数据中批量导入到数据库,还是将数据库中的数据导出为Excel格式供用户下载。...希望这些信息能对你在PHP Excel导入导出方面的工作提供帮助。
为了实现数据库导入和导出,你需要完成以下步骤: **数据库导入**: 1. 使用PHPExcel读取Excel文件,通常通过`PHPExcel_IOFactory::load()`方法。 2. 遍历Excel数据,可能使用`getActiveSheet()`和`getRowIterator...
本文将深入探讨如何使用PHP和MySQL来导入与导出Excel文件,主要涉及的工具是PHPExcel类。 首先,我们需要理解PHPExcel类。PHPExcel是一个开源的PHP库,它允许开发者读取、写入和操作多种电子表格文件格式,包括...
总结一下,通过ThinkPHP 3.2和PHPExcel的结合,我们可以实现高效的数据导入导出功能。理解并掌握这两个工具的使用,对于处理大量数据的Web应用来说,是非常有价值的。在实际操作中,不断实践和优化,可以让你的代码...
分享一个利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel的类。根据时间生成采购报表,实例化excel类,设置选定sheet表名,合并单元格 给单元格赋值(数值,字符串,公式),大边框样式 边框加粗,设置...
强大的MySQL数据库备份程序,对于较大的数据库可以选择采用多页导出、导入的方式,理论上可以备份任何大小的数据库。导出的文件为完整的PHP文件,可以直接在服务器中运行导入,无须借助外面工具,方便快捷且运行效率...
在PHP中处理Excel文件是一项常见的任务,特别是在数据处理、报表生成和数据分析等领域。本文将深入探讨如何使用PHP实现Excel的导入和导出功能,以及...希望这个简要的指南能帮助你理解和实现PHP中的Excel导入导出功能。
本篇文章将详细讨论如何使用PHP实现Excel数据与数据库之间的导入导出操作,并且涉及到相关的PHP操作数据库和Excel的技巧。 首先,关于PHP将Excel导入数据库的部分。在PHP中,可以使用各种第三方库或组件来读取Excel...
以上就是在ThinkPHP 3.2.3中实现导入导出功能和多图片上传的详细步骤。需要注意的是,实际开发中应根据项目需求进行适当的优化和调整,确保代码的可维护性和安全性。同时,随着技术的发展,考虑升级到更现代的...
标题“phpcms2008导入导出xls”涉及到的是PHP CMS系统——phpcms V2008中的一项核心功能,即数据的导入与导出,特别是与Microsoft Excel(XLS格式)文件的交互。在内容管理系统中,这种功能通常用于批量处理数据,...
本资源提供的"CVS文件的导入和导出php类代码.zip"是一个PHP类库,专门设计用于帮助开发者在PHP应用程序中便捷地处理CSV文件与数据库之间的数据交换。以下将详细介绍该类库的关键知识点。 首先,让我们理解一下CVS...
在PHP开发中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域。`phpExcel`是一个广泛使用的PHP库,它允许开发者创建、读取和修改Microsoft Excel文件,即使这些文件包含图像。本篇文章将深入...
它允许开发者通过编程方式处理Excel文件,从而实现数据的导入和导出。要使用PHPExcel,你需要先将其下载并引入到你的PHP项目中。 导入PHPExcel库后,你需要创建一个PHP脚本来读取Excel文件。可以使用`PHPExcel_...
总之,PHPExcel 1.8是PHP开发中处理Excel文件的强大工具,提供了丰富的API用于导入导出Excel数据。通过理解和掌握这些API,开发者能够高效地实现数据的交互,提高工作效率。在实践中,不断探索和优化,才能更好地...