发新话题
打印

cls_sql_dump类BUG!!!

cls_sql_dump类BUG!!!

康盛的一个数据库导出BUG!!! ECSHOP的数据备份、恢复功能不错,就将它整到fleaphp来使用。不想在使用过程中发现了这个bug:

cls_sql_dump 类中,


    /**
     *  获取指定表的定义
     *
     * @access  public
     * @param   string      $table      数据表名
     * @param   boolen      $add_drop   是否加入drop table
     *
     * @return  string      $sql
     */
    function get_table_df($table, $add_drop = false)
    {
        if ($add_drop)
        {
            $table_df = "DROP TABLE IF EXISTS `$table`;\r\n";
        }
        else
        {
            $table_df = '';
        }
        $tmp_arr = $this->db->getRow("SHOW CREATE TABLE `$table`");
        $tmp_sql = $tmp_arr['Create Table'];
        $tmp_sql = substr($tmp_sql, 0, strrpos($tmp_sql, ")") + 1); //去除行尾定义。
        if ($this->db->version() >= '4.1')
        {
            $table_df .= $tmp_sql . " ENGINE=MyISAM DEFAULT CHARSET=utf8;\r\n";
        }
        else
        {
            $table_df .= $tmp_sql . " TYPE=MyISAM;\r\n";
        }
        return $table_df;
    }


试想,如果我给数据表加了一个备注(COMMENT),即表结构为:

CREATE TABLE `ic_mailset` (
  `mailId` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`mailId`),
  KEY `userId` (`userId`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312 COMMENT='邮箱(报价单)设置';


在遇到使用后会问题:

备份出来的表结构成了

CREATE TABLE `ic_mailset` (
  `mailId` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`mailId`),
  KEY `userId` (`userId`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=gb2312 COMMENT='邮箱(报价单 ENGINE=MyISAM DEFAULT CHARSET=utf8;


不单是这个问题,还发现其它的不妥之处:
1. 强制性的将MYSQL数据表引擎改为MyISAM类型;(如果我起初是使用 innoDb呢?)
2. 强制性的将MYSQL字符集改为UTF8;(不知道GBK版本的cls_sql_dump类是否强制为gbk?)
3. 强制性的将表备注(COMMENT)去掉了;


其实,只要简单的去掉 AUTO_INCREMENT 自动编号就行了。


    /**
     *  获取指定表的定义
     *
     * @access  public
     * @param   string      $table      数据表名
     * @param   boolen      $add_drop   是否加入drop table
     *
     * @return  string      $sql
     */
    function get_table_df($table, $add_drop = false)
    {
        if ($add_drop)
        {
            $table_df = "DROP TABLE IF EXISTS `$table`;\r\n";
        }
        else
        {
            $table_df = '';
        }
        $tmp_arr = $this->db->getRow("SHOW CREATE TABLE `$table`");
        $tmp_sql = $tmp_arr['Create Table'];
        
         $tmp_sql = preg_replace('/AUTO_INCREMENT\=\d{1,}/im','',$tmp_sql);

         $table_df .= $tmp_sql . " ;\r\n";
        
        return $table_df;
    }


版权声明:本文原创发表于博客园,作者为 crossphp
本文版权归作者和博客园共同所有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。


http://www.ivend.cn 倾衣秀,时尚依人,韩版服饰
http://crossphp.cnblogs.com

TOP

感谢您的建议  我们会检查代码
不保留版权信息的各位XDJM,请原谅我不能为您解答问题!!!!http://www.testyang.com

TOP

又发现个BUG
http://www.ivend.cn 倾衣秀,时尚依人,韩版服饰
http://crossphp.cnblogs.com

TOP

你们有测试

使用扩展插入(Extended Insert)方式 是    否

有用吗?

我发现根本没有作用


$offset = 300;

所谓的“扩展插入”只是将所有的INSERT 语句组成了一条!!
如果表内有100000条数据,导出的“扩展插入”就会生成一条SQL语句,有100000个VALUE值。。。

INSERT INTO `ecs_admin_log` ( `log_id`, `log_time`, `user_id`, `log_info`, `ip_address` ) VALUES
( '1', '1201506751', '1', '添加广告位置: indexad', '127.0.0.1' ),
( '2', '1201506802', '1', '添加广告: 首页大图广告', '127.0.0.1' ),
( '3', '1201655478', '1', '编辑广告: 首页大图广告', '127.0.0.1' ),
( '4', '1201657821', '1', '添加广告位置: indexad2', '127.0.0.1' ),
....
( 100000, '1201657821', '1', '添加广告位置: indexad2', '127.0.0.1' ),


http://www.ivend.cn 倾衣秀,时尚依人,韩版服饰
http://crossphp.cnblogs.com

TOP

http://www.ivend.cn 倾衣秀,时尚依人,韩版服饰
http://crossphp.cnblogs.com

TOP

我们对比一下
不保留版权信息的各位XDJM,请原谅我不能为您解答问题!!!!http://www.testyang.com

TOP

发新话题