为什么$ 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;
}