使用ecmall的add时,可能会碰到这种情况,调用model类的add方法插入数据时,如果插入的数据的主键不是自增ID,就会返回空值,无法判断是否插入成功。
刚开始时没注意,还以为是因为我的sql语句写错了呢,后来翻了下base.model类下的add方法,才发现是本身的BUG,不得不再说一遍,ecmall代码写的实在是太…..

function add($data, $compatible = false){
    if (empty($data) || !$this->dataEnough($data))    {
        return false;
    }
    $data = $this->_valid($data);
    if (!$data){
        $this->_error('no_valid_data');
        return false;
    }
    $insert_info = $this->_getInsertInfo($data);
    $mode = $compatible ? 'REPLACE' : 'INSERT';
    $this->db->query("{$mode} INTO {$this->table}{$insert_info['fields']} VALUES{$insert_info['values']}");
    $insert_id = $this->db->insert_id();
    if ($insert_id){
        if ($insert_info['length'] > 1){
            for ($i = $insert_id; $i 

这里用的是php内置函数mysql_insert_id()返回了上一步 INSERT 操作产生的 ID。如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() 返回 0。
而我们很多时候会需要用到判断插入是否成功,所以我把原方法改了下,先判断是否有插入ID,如果没有,就判断是否执行成功,成功就返回true。

function add($data, $compatible = false){
    if (empty($data) || !$this->dataEnough($data)){
        return false;
    }
    $data = $this->_valid($data);
    if (!$data){
        $this->_error('no_valid_data');
        return false;
    }
    $insert_info = $this->_getInsertInfo($data);
    $mode = $compatible ? 'REPLACE' : 'INSERT';

    $query=$this->db->query("{$mode} INTO {$this->table}{$insert_info['fields']} VALUES{$insert_info['values']}");

    $insert_id = $this->db->insert_id();

    if ($insert_id){
        if ($insert_info['length'] > 1){
            for ($i = $insert_id; $i 

以上仅仅是为了满足本项目中开发而更改的,算是为各位看官起一个抛砖引玉的作用吧。