我目前正在编写这样一个控制器方法:
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)也被改变了。我如何知道更新查询是否成功?
我有一个担心和一些建议。
-
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
),那么通常使用1
和0
作为布尔值。在构造条件块时,我更喜欢在成功的结果之前写所有消极/错误/不成功的结果。
建议在允许软删除用户之前进行用户身份验证/授权检查,以便只有特权用户有权执行此操作。
-
Model:您的查询应该单独在模型中完成。由于查询可能没有语法错误,但也没有对数据库进行更改,因此必须在两点检查该进程。
考虑如下情况:
- 传递给控制器的
$userId
在数据库中不存在或 - 包含
$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()
函数的输出返回true
或false
:
if ($this->db->update('mytable', $mydata)) {
// Do some stuff
return true;
} else {
// Do some stuff
return false;
}
或者如果你不需要在你的模型中做任何其他事情,只要这样做:
return $this->db->update('mytable', $mydata);