adai 发表于 2008-12-31 23:13:56

CodeIgniter中数据库工具类backup()的问题

在数据库备份中,可以利用CodeIgniter自带的数据库工具$this->dbutil->backup()处理,生成备份SQL文件,还是很方便的。但是这个函数不支持VIEW,虽然也能生成SQL语句,但生成的是DROP TABLE,而不是DROP VIEW,VIEW本身是不需要导出里面的数据,因此会导致生成的备份文件无法重新导入数据库中,需要对框架进行修改;

修改文件:\system\database\drivers\mysql\mysql_utility.php中的_backup(...)方法;

增加内容如下(红色部分):

   // Write out the table schema
   $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
    if ($add_drop == TRUE)
    {
    $output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;
   }
   
   /* add by adai 20081231 for view */
   $is_view = FALSE;
    if ($add_drop == TRUE)
    {
    $view_query = $this->db->query("SHOW TABLE STATUS FROM ".$this->db->database.' LIKE \''.$table.'\'');
    $view_arr = $view_query->result_array();
    foreach ($view_arr as $val)
    {
   $comment = $val['Comment'];
    }
    if(substr($comment, 0, 4) == 'VIEW')
    {
   $output .= 'DROP VIEW IF EXISTS '.$table.';'.$newline.$newline;
   $is_view = TRUE;
    }
   }
   /* end add 20081231 for view */
   $i = 0;
   $result = $query->result_array();
   foreach ($result as $val)
   {
    if ($i++ % 2)
    {      
   $output .= $val.';'.$newline.$newline;
    }
   }
   
   // If inserts are not needed we're done...
   if ($add_insert == FALSE)
   {
    continue;
   }
   /* add by adai 20081231 for view */
    if ($is_view == TRUE)
    {
    continue;
   }
   /* end add 20081231 for view */
   // Grab all the data from the current table
   $query = $this->db->query("SELECT * FROM $table");
   
   if ($query->num_rows() == 0)
   {
    continue;
   }

Hex 发表于 2009-1-9 00:49:11

这也可以算是一个 BUG 了,呵呵。

あ淩度ツ﹎ 发表于 2012-4-20 17:34:32

标记一下
页: [1]
查看完整版本: CodeIgniter中数据库工具类backup()的问题