如何在Codeigniter中检测创建、更新、删除查询是否成功?


How can I detect a create, update, delete query is successful in Codeigniter

我目前正在编写这样一个控制器方法:

public function delete($user_id) {
    if ($this->input->server('REQUEST_METHOD')=='POST') {
        $result = $this->Crm_user_model->update($user_id,
                                                array('deleted'=>true));
        if($result) {
            add_flash_message('info', 'deleted');
        } else {
            add_flash_message('alert', 'can not delete');
        }
        //redirect('user/view');
    }
} 

但是所有的结果都没有返回任何东西,甚至数据库(mssql)也被改变了。我如何知道更新查询是否成功?

我有一个担心和一些建议。

  1. Controller:您不应该通过url将$user_id值传递给delete控制器。(如site/ci/delete/99)每当你"写作"的时候您应该只使用$_POST将数据传输到服务器端。

    public function softDeleteUser(): void
    {
        $userId = $this->input->post('user_id');
        if (!$userId) {
            add_flash_message('alert', 'Required data not supplied');
        } elseif (!$this->Crm_user_model->update($userId, ['deleted' => true])) {
            add_flash_message('alert', 'Failed to soft delete user');
        } else {
            add_flash_message('info', 'Soft deleted user');
        }
    }
    

    如果没有user_id POST'ed,那么$userId将被声明为null

    如果您的数据库模式不能存储布尔值(true),那么通常使用10作为布尔值。

    在构造条件块时,我更喜欢在成功的结果之前写所有消极/错误/不成功的结果。

    建议在允许软删除用户之前进行用户身份验证/授权检查,以便只有特权用户有权执行此操作。

  2. Model:您的查询应该单独在模型中完成。由于查询可能没有语法错误,但也没有对数据库进行更改,因此必须在两点检查该进程。

    考虑如下情况:

    1. 传递给控制器的$userId在数据库中不存在或
    2. 包含$userId的行已经"软删除"。

    在这两种情况下,查询都不会失败,但是不会有受影响的行。这些是您的脚本与实际更改更新区分的相关事件。

    public function update(int $userId, array $newData): int
    {
        // ensure that no one can ever modify the user_id column value
        unset($newData['user_id']);
        if ($this->db->update('user_tablename', $newData, ['user_id' => $userId])) {
            $affectedRows = $this->db->affected_rows();
            if ($affectedRows) {
                // potentially log successful change if your system keeps track of change history
                // $this->Log->userChange($userId, $newData);
            }
            return $affectedRows;
        }
        return 0;
    }
    

    如果有语法错误,它将在您的错误日志中。

crm_user_model->update()中,根据CodeIgniter的update()函数的输出返回truefalse:

if ($this->db->update('mytable', $mydata)) {
    // Do some stuff
    return true;
} else {
    // Do some stuff
    return false;
}

或者如果你不需要在你的模型中做任何其他事情,只要这样做:

return $this->db->update('mytable', $mydata);