为什么$ this-> db-> affected_rows()返回0?

时间:2018-10-29 16:39:59

标签: php mariadb codeigniter-3

以下代码是在代码点火器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。为什么会这样?

2 个答案:

答案 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