以下代码是在代码点火器3中编写的,用于删除用户:
public function deleteUser($id) {
$this->db->trans_start();
$this->db->where('usma_user_id', $id);
$this->db->delete('ec_usma_usermain');
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$transResult = array(
'response' => 'Operation failed!',
'status' => TRUE
);
} else if ($this->db->trans_status() === TRUE) {
if($this->db->affected_rows() > 0 ) {
$transResult = array(
'response' => 'Operation executed successfully!',
'status' => TRUE
);
} else {
$transResult = array(
'response' => 'Unexpected error! Contact admin.',
'status' => FALSE
);
}
}
return $transResult;
}
在上面的函数中,即使有一行被删除,返回的响应也是
意外错误!与管理员联系
这意味着返回值
echo $this->db->affected_rows();
为0(零)。所以我检查(回显)了
的输出 echo $this->db->affected_rows();
之前
echo $this->db->trans_complete();
被执行,它返回否。删除的行(在我的情况下为1行),并且如果在
之后写了同一行代码 echo $this->db->trans_complete();
它返回0。为什么会这样?
答案 0 :(得分:1)
在此页面上查看注释:https://www.codeigniter.com/userguide3/database/helpers.html
”注意:在MySQL中,“从表中删除”将返回0个受影响的行。数据库类具有一个小的hack,可让其返回正确数量的受影响的行。默认情况下,此hack已启用,但可以在数据库驱动程序文件中关闭。”
只要启用了这种破解(听起来像是您的问题),一种解决方法就是在查询执行之后和结束事务之前简单地存储affected_rows
。看起来像这样:
public function deleteUser($id) {
$this->db->trans_start();
$this->db->where('usma_user_id', $id);
$this->db->delete('ec_usma_usermain');
//store the affected_row value here
$affectedRows=$this->db->affected_rows();
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$transResult = array(
'response' => 'Operation failed!',
'status' => TRUE
);
} else if ($this->db->trans_status() === TRUE) {
//recall the stored value here
if($affectedRows > 0 ) {
$transResult = array(
'response' => 'Operation executed successfully!',
'status' => TRUE
);
} else {
$transResult = array(
'response' => 'Unexpected error! Contact admin.',
'status' => FALSE
);
}
}
return $transResult;
}
答案 1 :(得分:1)
实际上,$this->db->affected_rows()
返回受last语句影响的行数。这里的最后一条语句是$this->db->trans_complete()
,受影响的行数是0
。