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

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

问题描述:

Following function is written in codeigniter 3 for deleting user:

    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;

    }

In above function even when there is a row and it is deleted response returned is

Unexpected error! Contact admin

Which means value returned by

    echo $this->db->affected_rows();

is 0 (zero). So I checked (echoed) the output of

    echo $this->db->affected_rows(); 

before

    echo $this->db->trans_complete();

is executed, it returned no. of deleted rows (in my case 1 row) and if same line of code is written after

    echo $this->db->trans_complete();

it returns 0. Why is it so?

Actually, $this->db->affected_rows() returns the number of rows affected by last statement. Here last statement is $this->db->trans_complete() by which number of affected row is 0.

Check out the note on this page: https://www.codeigniter.com/userguide3/database/helpers.html

"Note: In MySQL “DELETE FROM TABLE” returns 0 affected rows. The database class has a small hack that allows it to return the correct number of affected rows. By default this hack is enabled but it can be turned off in the database driver file."

As long as this hack is enabled (and it sounds like it is from your question), then a workaround would be to simply store the affected_rows after the query executes and before you end the transaction. It would look something like this:

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;

}