ci3执行delete必须使用查询绑定或链式where/delete,禁用字符串拼接;推荐$query()配合占位符或$where()->delete()链式调用,并强制limit防误删。

CodeIgniter 3(CI3)原生 SQL 执行 DELETE 语句时,**不能直接用 $this->db->query() 拼接变量**,否则极易引发 SQL 注入。正确做法是使用 CI3 内置的**查询绑定(Query Binding)机制**——它底层调用的是预编译式参数化查询(类似 PreparedStatement),能自动转义并安全绑定值,彻底隔离数据与 SQL 结构。
用 query() + 绑定数组(推荐)
这是最常用、最清晰的方式,适用于简单或中等复杂度的 DELETE 条件:
- SQL 中用
:name占位符(冒号+键名),不加引号 - 第二个参数传关联数组,键名必须与占位符一致
- CI3 自动处理类型识别、转义和绑定,无需手动加单引号
示例:
$this->db->query("DELETE FROM users WHERE status = :status AND created_at 'status' => 'inactive','before' => date('Y-m-d H:i:s', strtotime('-30 days'))
]);
用 where() + delete() 链式调用(更安全、更 CI 风格)
完全避开手写 SQL 字符串,由框架生成参数化 DELETE,适合条件明确、字段标准的场景:
- 所有 where 条件值都会被自动绑定和转义
- 支持数组条件、范围操作(如
where_in)、日期比较等 - 可链式调用
limit()防误删(强烈建议)
示例:
$this->db->where('status', 'inactive')->where('created_at ->limit(1000) // 关键!防全表误删
->delete('users');
避免这些高危写法
以下方式**一律禁止**,存在明确注入风险:
-
$this->db->query("DELETE FROM users WHERE id = " . $id);—— 直接拼接,零防护 -
$this->db->query("DELETE FROM users WHERE email = '" . $email . "'");—— 手动加引号仍不可靠,特殊字符会破坏结构 - 用
escape()或escape_str()手动处理后再拼接 —— 易遗漏、难维护、非根本解法
进阶:批量删除带动态字段或子查询?
若需更复杂逻辑(如根据另一张表结果删除),优先考虑:
- 拆成两步:先查出 ID 列表 → 用
where_in()安全删除 - 或改用存储过程(确保数据库账户无 EXECUTE 权限以外的高危权限)
- 绝不把用户输入拼进子查询字符串中











