使用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 < $insert_id + $insert_info['length']; $i++){
$id[] = $i;
}
}else{
/* 添加单条记录 */
$id = $insert_id;
}
}
return $id;
}
这里用的是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 < $insert_id + $insert_info['length']; $i++){
$id[] = $i;
}
}else{
/* 添加单条记录 */
$id = $insert_id;
}
}else{
//由于不是自增ID 返回的为空 无法判断是否添加成功 故加了一个这个判断。//Sin
if($query){
return true;
}else{
return false;
}
}
return $id;
}
以上仅仅是为了满足本项目中开发而更改的,算是为各位看官起一个抛砖引玉的作用吧。
请把最起码的版权请留给博主,谢谢!
http://www.ruesin.com/open/ecmall/ecm_add-105.html