codeigniter中删除操作需用affected_rows()判断结果:大于0表示删除成功,等于0表示无匹配记录,-1表示查询失败;delete()方法仅返回执行是否成功,不反映实际删除情况。

CodeIgniter 中执行删除操作后,可以通过 $this->db->affected_rows() 获取受影响的行数来判断是否删除成功。
删除后检查受影响行数
CodeIgniter 的 delete() 方法本身不直接返回布尔值,而是返回一个布尔值表示查询是否执行成功(比如 SQL 语法是否正确、连接是否正常),但不反映是否有数据被实际删除。真正判断“有没有删掉数据”,要依赖 affected_rows():
- 返回 大于 0:说明有记录被删除,操作成功且生效;
- 返回 0:SQL 执行成功,但没有匹配到符合条件的记录(即“删了个寂寞”);
- 返回 -1:通常表示查询失败(如权限不足、表不存在等),此时应结合
$this->db->error()进一步排查。
典型使用示例
以删除 ID 为 123 的用户为例:
$this->db->where('id', 123);
$this->db->delete('users');
if ($this->db->affected_rows() > 0) {
echo "删除成功";
} elseif ($this->db->affected_rows() == 0) {
echo "未找到匹配记录,无数据被删除";
} else {
$error = $this->db->error();
echo "删除失败:" . $error['message'];
}
注意事务与批量删除场景
在事务中或执行批量删除(如 WHERE IN)时,affected_rows() 返回的是本次 DELETE 语句实际影响的总行数,仍可可靠用于结果判断:
- 批量删除 10 条匹配记录 → 返回 10;
- 事务中删除后 rollback →
affected_rows()在 rollback 后不可靠,应在 commit 前检查; - 使用
empty_table()或truncate()清空表时,affected_rows()可能返回 0(取决于数据库驱动),不建议用它判断清空结果,应改用其他方式验证。
替代方案:封装成更语义化的方法
可将逻辑封装为模型方法,提升可读性:
public function delete_user($id) {
$this->db->where('id', $id);
$this->db->delete('users');
$rows = $this->db->affected_rows();
return $rows > 0 ? true : ($rows === 0 ? 'not_found' : false);
}
// 调用
$result = $this->user_model->delete_user(123);
if ($result === true) {
// 成功
} elseif ($result === 'not_found') {
// 不存在
} else {
// 错误
}











