PHP备份数据库并发送电子邮件

标签 php mysql database email

我找到了一个 PHP 脚本,它可以备份我网站的数据库并将文件发送到我选择的电子邮件地址。我在我的网站上实现了它,但失败了。

备份类。这处理备份和电子邮件:

<?php
   class Backup
   {
       /**
        * @var stores the options
        */
       var $config;

       /**
        * @var stores the final sql dump
        */
       var $dump;

       /**
        * @var stores the table structure + inserts for every table
        */
       var $struktur = array();

       /**
        * @var zip file name
        */
       var $datei;


       /**
        * this function is the constructor and phrase the options
        * and connect to the database
        * @return
        */
       public function Backup($options)
       {
               // write options
               foreach($options AS $name => $value)
               {
                       $this->config[$name] = $value;
               }

               // check mysql connection
               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());
       }

       /**
        * this function start the backup progress its the core function
        * @return
        */
       public function backupDB()
       {
               // start backup
               if(isset($_POST['backup']))
               {
                       // check if tables are selected
                       if(empty($_POST['table']))
                       {
                               die("Please select a table.");
                       }

                       /** start backup **/
                       $tables = array();
                       $insert = array();
                       $sql_statement = '';

                       // lock tables
                       foreach($_POST['table'] AS $table)
                       {
                                mysql_query("LOCK TABLE $table WRITE");

                               // Read table structure
                               $res = mysql_query('SHOW CREATE TABLE '.$table.'');
                               $createtable = mysql_result($res, 0, 1);
                               $str = "\n\n".$createtable."\n\n";

                               array_push($tables, $str);

                               // Read table "inserts"
                   $sql = 'SELECT * FROM '.$table;
                   $query = mysql_query($sql) or die(mysql_error());
                   $feld_anzahl = mysql_num_fields($query);

                               $sql_statement = '--
-- Data Table `$table`
--

                                       ';

                               // start reading progress
                   while($ds = mysql_fetch_object($query)){
                       $sql_statement .= 'INSERT INTO `'.$table.'` (';

                       for ($i = 0;$i <$feld_anzahl;$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 <$feld_anzahl;$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 "Inserts" into an array if not exists
                               if(!in_array($sql_statement, $insert))
                               {
                                       array_push($insert, $sql_statement);
                                       unset($sql_statement);
                               }

                               unset($sql_statement);

                       }

                       // put table structure and inserts together in one var
                       $this->struktur = array_combine($tables, $insert);

                       // create full dump
                       $this->createDUMP($this->struktur);

                       // create zip file
                       $this->createZIP();

                       /** end backup **/

                       // send an email with the sql dump
                       if(isset($this->config['email']) && !empty($this->config['email']))
                       {
                               $this->sendEmail();
                       }

                       // output
                       echo '<h3 style="color:green;">Backup war erfolgreich</h3><a href="'.$this->datei.'">Download Backup</a>
                       <br />
                       <br />';
               }
       }

       /**
        * this function generate an email with attachment
        * @return
        */
       protected function sendEmail()
       {
                       // start sending emails
                       foreach($this->config['email'] AS $email)
                       {
                               $to = $email;

                               $from = $this->config['email'][0];

                               $message_body = "This email contains the database backup as a zip file.";

                               $msep = strtoupper (md5 (uniqid (time ())));

                               // set email header (only text)
                               $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";

                               // file name
                               $dateiname = $this->datei;

                               // get filesize of zip file
                               $dateigroesse = filesize ($dateiname);

                               // open file to read
                               $f = fopen ($dateiname, "r");
                               // save content
                               $attached_file = fread ($f, $dateigroesse);
                               // close file
                               fclose ($f);

                               // create attachment
                               $attachment = chunk_split (base64_encode ($attached_file));

                               // set attachment header
                               $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";

                               // mark end of attachment
                               $header .= "--" . "$msep--" . ";

                               // eMail Subject
                               $subject = "Database Backup";

                               // send email to emails^^
                               if(mail($to, $subject, '', $header) == FALSE)
                               {
                                       die("The email could not be sent. Please check the email address.");
                               }

                               echo "<p><small>Email was successfully sent.</small></p>";
                       }
       }

       /**
        * this function create the zip file with the database dump and save it on the ftp server
        * @return
        */
       protected function createZIP()
       {

               // Set permissions to 777
               chmod($this->config['folder'], 0777);

               // create zip file
               $zip = new ZipArchive();
               // Create file name
               $this->datei = $this->config['folder'] . $this->config['mysql'][3] . "_" . date("j_F_Y_g:i_a") . ".zip";

               // Checking if file could be created
               if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
                       exit("cannot open <".$this->datei.">\n");
               }

               // add mysql dump to zip file
               $zip->addFromString("dump.sql", $this->dump);
               // close file
               $zip->close();

               // Check whether file has been created
               if(!file_exists($this->datei))
               {
                       die("The ZIP file could not be created.");
               }

               echo "<p><small>The zip was created.</small></p>";
       }

       /**
        * this function create the full sql dump
        * @param object $dump
        * @return
        */
       protected function createDUMP($dump)
       {
               $date = date("F j, Y, g:i a");

               $header = <<<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;
       }


       /**
        * this function displays the output form to select tables
        * @return
        */
       public function outputForm()
       {
               // select all tables from database
               $result = mysql_list_tables($this->config['mysql'][3]);

               $buffer = '
               <fieldset>
                       <legend>Select some tables</legend>
                       <form method="post" action="">
               <select name="table[]" multiple="multiple" size="30">';
               while($row = mysql_fetch_row($result))
               {
                       $buffer .= '<option value="'.$row[0].'">'.$row[0].'</option>';
               }
               $buffer .= '</select>
               <br /><br />
               <input type="submit" name="backup" value="Backup Tables" />
               </form>
               </fieldset>';

               echo $buffer;
       }
    }
?>

接下来是当用户按下网站上的“备份”按钮时调用的处理程序:

<?php
    //You can add as many email addresses as you like
    $options = array(   'email' => array('email1, email2'),
                        'folder' => './backup/',
                        'mysql' => array('localhost', 'root', '', 'database')
                    );

    $b = new Backup($options);

    // if submit form start backup
    if(isset($_POST['backup']))
    {
        // start backup
        $b->backupDB();
    }

    // display tables
    $b->outputForm();
?>  

据我所知,最后一个脚本有效。但另一个给出了以下错误信息

Parse error: syntax error, unexpected T_VARIABLE in /home/u164555197/public_html/ChiroDB2/Scripts/PHP/backupdb.php on line 170 

第 170 行位于处理电子邮件生成的函数中(函数 SendEmail())

有人可以帮我找到这个错误并可能有解决方案吗?

最佳答案

更改线路,使其保持原样

// mark end of attachment
$header .= "--" . $msep . "--";

// eMail Subject
$subject = "Database Backup";

这是您粘贴的类的第 202 行。

<?php
   class Backup
   {
       /**
        * @var stores the options
        */
       var $config;

       /**
        * @var stores the final sql dump
        */
       var $dump;

       /**
        * @var stores the table structure + inserts for every table
        */
       var $struktur = array();

       /**
        * @var zip file name
        */
       var $datei;


       /**
        * this function is the constructor and phrase the options
        * and connect to the database
        * @return
        */
       public function Backup($options)
       {
               // write options
               foreach($options AS $name => $value)
               {
                       $this->config[$name] = $value;
               }

               // check mysql connection
               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());
       }

       /**
        * this function start the backup progress its the core function
        * @return
        */
       public function backupDB()
       {
               // start backup
               if(isset($_POST['backup']))
               {
                       // check if tables are selected
                       if(empty($_POST['table']))
                       {
                               die("Please select a table.");
                       }

                       /** start backup **/
                       $tables = array();
                       $insert = array();
                       $sql_statement = '';

                       // lock tables
                       foreach($_POST['table'] AS $table)
                       {
                                mysql_query("LOCK TABLE $table WRITE");

                               // Read table structure
                               $res = mysql_query('SHOW CREATE TABLE '.$table.'');
                               $createtable = mysql_result($res, 0, 1);
                               $str = "\n\n".$createtable."\n\n";

                               array_push($tables, $str);

                               // Read table "inserts"
                   $sql = 'SELECT * FROM '.$table;
                   $query = mysql_query($sql) or die(mysql_error());
                   $feld_anzahl = mysql_num_fields($query);

                               $sql_statement = '--
-- Data Table `$table`
--

                                       ';

                               // start reading progress
                   while($ds = mysql_fetch_object($query)){
                       $sql_statement .= 'INSERT INTO `'.$table.'` (';

                       for ($i = 0;$i <$feld_anzahl;$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 <$feld_anzahl;$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 "Inserts" into an array if not exists
                               if(!in_array($sql_statement, $insert))
                               {
                                       array_push($insert, $sql_statement);
                                       unset($sql_statement);
                               }

                               unset($sql_statement);

                       }

                       // put table structure and inserts together in one var
                       $this->struktur = array_combine($tables, $insert);

                       // create full dump
                       $this->createDUMP($this->struktur);

                       // create zip file
                       $this->createZIP();

                       /** end backup **/

                       // send an email with the sql dump
                       if(isset($this->config['email']) && !empty($this->config['email']))
                       {
                               $this->sendEmail();
                       }

                       // output
                       echo '<h3 style="color:green;">Backup war erfolgreich</h3><a href="'.$this->datei.'">Download Backup</a>
                       <br />
                       <br />';
               }
       }

       /**
        * this function generate an email with attachment
        * @return
        */
       protected function sendEmail()
       {
                       // start sending emails
                       foreach($this->config['email'] AS $email)
                       {
                               $to = $email;

                               $from = $this->config['email'][0];

                               $message_body = "This email contains the database backup as a zip file.";

                               $msep = strtoupper (md5 (uniqid (time ())));

                               // set email header (only text)
                               $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";

                               // file name
                               $dateiname = $this->datei;

                               // get filesize of zip file
                               $dateigroesse = filesize ($dateiname);

                               // open file to read
                               $f = fopen ($dateiname, "r");
                               // save content
                               $attached_file = fread ($f, $dateigroesse);
                               // close file
                               fclose ($f);

                               // create attachment
                               $attachment = chunk_split (base64_encode ($attached_file));

                               // set attachment header
                               $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";

                               // mark end of attachment
                               $header .= "--" . $msep . "--";

                               // eMail Subject
                               $subject = "Database Backup";

                               // send email to emails^^
                               if(mail($to, $subject, '', $header) == FALSE)
                               {
                                       die("The email could not be sent. Please check the email address.");
                               }

                               echo "<p><small>Email was successfully sent.</small></p>";
                       }
       }

       /**
        * this function create the zip file with the database dump and save it on the ftp server
        * @return
        */
       protected function createZIP()
       {

               // Set permissions to 777
               chmod($this->config['folder'], 0777);

               // create zip file
               $zip = new ZipArchive();
               // Create file name
               $this->datei = $this->config['folder'] . $this->config['mysql'][3] . "_" . date("j_F_Y_g:i_a") . ".zip";

               // Checking if file could be created
               if ($zip->open($this->datei, ZIPARCHIVE::CREATE)!==TRUE) {
                       exit("cannot open <".$this->datei.">\n");
               }

               // add mysql dump to zip file
               $zip->addFromString("dump.sql", $this->dump);
               // close file
               $zip->close();

               // Check whether file has been created
               if(!file_exists($this->datei))
               {
                       die("The ZIP file could not be created.");
               }

               echo "<p><small>The zip was created.</small></p>";
       }

       /**
        * this function create the full sql dump
        * @param object $dump
        * @return
        */
       protected function createDUMP($dump)
       {
               $date = date("F j, Y, g:i a");

               $header = <<<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;
       }


       /**
        * this function displays the output form to select tables
        * @return
        */
       public function outputForm()
       {
               // select all tables from database
               $result = mysql_list_tables($this->config['mysql'][3]);

               $buffer = '
               <fieldset>
                       <legend>Select some tables</legend>
                       <form method="post" action="">
               <select name="table[]" multiple="multiple" size="30">';
               while($row = mysql_fetch_row($result))
               {
                       $buffer .= '<option value="'.$row[0].'">'.$row[0].'</option>';
               }
               $buffer .= '</select>
               <br /><br />
               <input type="submit" name="backup" value="Backup Tables" />
               </form>
               </fieldset>';

               echo $buffer;
       }
    }
?>

关于PHP备份数据库并发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545610/

相关文章:

database - Wordpress 数据库导入

javascript - 使用 ajax 将 php 响应发布到 div 中不起作用

mysql - TO_DATE 查询的 MS SQL 版本

mysql - 将数据从父查询传递到子查询

database - 使用主键值字符 "1"而不是 int 值 1

MySQL:嵌套选择速度问题

PHP 表单验证函数

php - 表行颜色更改未按计划工作

php - 如何使 ZEND_BEGIN_ARG_INFO_EX 控制传递给 PHP 扩展的参数数量?

mysql - 比特纳米。重置mysql根密码