Почему $ this-> db-> disabled_rows () возвращает 0? - PullRequest
0 голосов
/ 29 октября 2018

Следующая функция записана в codeigniter 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 голосов
/ 29 октября 2018

На самом деле, $this->db->affected_rows() возвращает количество строк, затронутых последним оператором. Здесь последний оператор $this->db->trans_complete(), по которому номер затронутой строки равен 0.

0 голосов
/ 29 октября 2018

Ознакомьтесь с примечанием на этой странице: https://www.codeigniter.com/userguide3/database/helpers.html

"Примечание. В MySQL« DELETE FROM TABLE »возвращает 0 затронутых строк. У класса базы данных есть небольшой хак, который позволяет ему возвращать правильное количество затронутых строк. По умолчанию этот хак включен, но он может быть отключено в файле драйвера базы данных. "

Пока этот хак включен (и это звучит так, как будто это ваш вопрос), то обходным решением будет просто сохранить 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;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...