array('email1', 'email2'),'folder' => './backup/','mysql' => array('localhost', 'user', 'password', 'db')); $b = new backup($options); // 提交备份命令 if(isset($_post['backup'])) { // 开始备份 $b->backupdb(); } // 显示备份表 $b->outputform();?>
复制代码
php数据库备份类的实现代码:
$value){$this->config[$name] = $value;} // 连接数据库mysql_connect($this->config['mysql'][0], $this->config['mysql'][1],$this->config['mysql'][2]) or die(mysql_error());mysql_select_db($this->config['mysql'][3]) or die(mysql_error());} /*** 执行备份数据库流程的函数* @return*/public function backupdb(){// 开始备份的命令if(isset($_post['backup'])){// 检测是否选择了数据表if(empty($_post['table'])){die(请选择一个数据表。);} /** 开始备份 **/$tables = array();$insert = array();$sql_statement = ''; // 锁定需要备份的数据库,防止读脏数据foreach($_post['table'] as $table){mysql_query(lock table $table write); // 获取数据库结构$res = mysql_query('show create table '.$table.'');$createtable = mysql_result($res, 0, 1);$str = \n\n.$createtable.\n\n; array_push($tables, $str); // 查询数据表中的所有数据行$sql = 'select * from '.$table;$query = mysql_query($sql) or die(mysql_error());$feld_anzahl = mysql_num_fields($query); $sql_statement = '---- data table `$table`--'; // 开始读数据,并将其转换为insert命令while($ds = mysql_fetch_object($query)){$sql_statement .= 'insert into `'.$table.'` ('; for ($i = 0;$i if ($i ==$feld_anzahl-1){$sql_statement .= mysql_field_name($query,$i);} else {$sql_statement .= mysql_field_name($query,$i).', ';}} $sql_statement .= ') values ('; for ($i = 0;$i $name = mysql_field_name($query,$i);if (empty($ds->$name)){$ds->$name = 'null';}if ($i ==$feld_anzahl-1){$sql_statement .= ''.$ds->$name.'';} else {$sql_statement .= ''.$ds->$name.', ';}}$sql_statement .= );\n;} // 将insert数据放在数组中,去重if(!in_array($sql_statement, $insert)){array_push($insert, $sql_statement);unset($sql_statement);} unset($sql_statement); } // 将数据库结构与insert命令放在一起啦$this->struktur = array_combine($tables, $insert); // 执行dump函数$this->createdump($this->struktur); // 生成zip压缩包$this->createzip(); /** 备份结束 **/ // 发一封邮件到指定邮箱,附件包含sql备份,如果你设置了的话^_^if(isset($this->config['email']) && !empty($this->config['email'])){$this->sendemail();} // outputecho '备份完成啦datei.'>下载备份
';}} /*** 发送邮件函数* @return*/protected function sendemail(){// 读取邮箱地址foreach($this->config['email'] as $email){$to = $email; $from = $this->config['email'][0]; $message_body = 本邮件中包含的zip压缩包为数据库备份; $msep = strtoupper (md5 (uniqid (time ()))); // 设置email头$header =from: $from\r\n .mime-version: 1.0\r\n .content-type: multipart/mixed; boundary=.$msep.\r\n\r\n .--$msep\r\n .content-type: text/plain\r\n .content-transfer-encoding: 8bit\r\n\r\n .$message_body . \r\n; // 文件名$dateiname = $this->datei; // 压缩包大小$dateigroesse = filesize ($dateiname); // 读取压缩包$f = fopen ($dateiname, r);// 保存到附件$attached_file = fread ($f, $dateigroesse);// 关闭压缩包fclose ($f);// 建立一个附件$attachment = chunk_split (base64_encode ($attached_file)); // 设置附件头$header .=-- . $msep . \r\n .content-type: application/zip; name='backup'\r\n .content-transfer-encoding: base64\r\n .content-disposition: attachment; filename='backup.zip'\r\n .content-description: mysql datenbank backup im anhang\r\n\r\n .$attachment . \r\n; // 标记附件结束未知$header .= --$msep--; // 邮件标题$subject = 数据库备份; // 发送邮件需要开启php相应支持哦^^if(mail($to, $subject, '', $header) == false){die(无法发送邮件,请检查邮箱地址);} echo 邮件发送成功
;}} /*** 建立数据库备份的压缩包并保存到服务器指定目录中* @return*/protected function createzip(){ // 文件夹权限要够chmod($this->config['folder'], 0777); // 建立压缩包$zip = new ziparchive();// 设置压缩包文件名$this->datei = $this->config['folder'].$this->config['mysql'][3]._.date(j_f_y_g_i_a)..zip; // 看看压缩包能不能打开if ($zip->open($this->datei, ziparchive::create)!==true) {exit(无法打开 datei.>\n);} // 把dump出来的数据放到压缩包里$zip->addfromstring(dump.sql, $this->dump);// 关闭压缩包$zip->close(); // 看看压缩包有没有生成if(!file_exists($this->datei)){die(无法生成压缩包);} echo 数据库备份压缩包成功生成
;} /*** mysql dump函数* @param object $dump* @return*/protected function createdump($dump){$date = date(f j, y, g:i a); $header = -- sql dump---- host: {$_server['http_host']}-- erstellungszeit: {$date} ---- datenbank: `{$this->config['mysql'][3]}`-- -- -------------------------------------------------------- header;foreach($dump as $name => $value){$sql .= $name.$value;}$this->dump = $header.$sql;} /*** 生成选择数据表的界面函数* @return*/public function outputform(){// 选择全部$result = mysql_list_tables($this->config['mysql'][3]); $buffer = '选择需要备份的数据表';while($row = mysql_fetch_row($result)){$buffer .= ''.$row[0].'';}$buffer .= '
'; echo $buffer;}} ?>
复制代码