CodeIgniter3更新字段自增自减的数据库语句写法
时间:2026-08-16 | 作者:实验室老王 | 阅读:0在 CI3 里,实现字段自增或自减的关键,就是 set() 的第三个参数要传 FALSE。这样可以跳过转义,让 SQL 表达式原样执行,例如:$this->db->set('point', 'point + 1', FALSE)。
另外,无符号字段还要配合 IF() 处理,避免数值回绕。同时,也不能忽略字段类型、WHERE 条件,以及 SQL 注入防护这些基础但非常要紧的细节。
CI3(CodeIgniter 3)中更新字段实现自增或自减,核心是绕过框架默认的字符串转义机制,让 SQL 表达式直接执行,避免被当作普通字符串处理。
核心实现方式
用 set() 方法配合第三个参数 FALSE
CI3 的 $this->db->set() 支持第三个布尔参数。设为 FALSE 后,可禁用自动引号包裹,使字段表达式直接参与 SQL 构建。
- 自加 1:
$this->db->set('point', 'point + 1', FALSE); - 自加 N:
$this->db->set('score', 'score + 5', FALSE); - 自减 1:
$this->db->set('stock', 'stock - 1', FALSE); - 自减 N:
$this->db->set('balance', 'balance - 100', FALSE);
设置完成后,再调用 $this->db->where() 和 $this->db->update(),即可完成更新操作。
需要特别注意的是,字段名必须准确,运算表达式也不能写错。同时,数据库字段类型必须支持此类运算,比如 INT、BIGINT。
无符号字段的安全处理
防止负数溢出的保护写法
对无符号整型,如 SMALLINT UNSIGNED,如果直接执行 field - 1,当值为 0 时会回绕成最大值,例如 65535。
因此,应结合 MySQL 的 IF() 函数做边界判断。
- 安全减 1:
$this->db->set('comments', "IF(comments < 1, 0, comments - 1)", FALSE); - 安全减 N:
$this->db->set('views', "IF(views < 10, 0, views - 10)", FALSE);
这种写法可以在一条 SQL 中同时完成判断与更新,无需先查后改。
这样既能减少并发风险,也能减少数据库往返次数。
封装复用更高效
封装成可复用的方法
可在 Model 中封装通用方法,提升代码复用性和可读性。
inc_field($table, $id, $field, $step = 1):执行$field = $field + $stepdec_field($table, $id, $field, $step = 1, $unsigned = TRUE):若$unsigned为真,自动添加IF()保护
例如调用 $this->dec_field('articles', 123, 'comments', 1, TRUE),内部即生成带 IF 判断的安全减法语句。
使用时的注意事项
注意事项
使用这类原生表达式时,需要格外留意以下几点:
- 确保字段存在且类型兼容,否则 UPDATE 会静默失败或报错
- WHERE 条件必须明确,避免误更新整表
- 事务中使用时,建议搭配
$this->db->trans_start()保证原子性 - 不要在表达式中拼接用户输入,防止 SQL 注入;如需动态 step 值,应先过滤为整数
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 以下哪种食材被称为“地下苹果” 蚂蚁庄园今日答案9.18
- 时间:2026-09-17
-
- 蚂蚁庄园今天答题答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园答题今日答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园小课堂2026年9月18日最新题目答案
- 时间:2026-09-17
-
- 小鸡答题今天的答案是什么2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园每日答题答案2026年9月18日
- 时间:2026-09-17
-
- 蔬菜洗完掉色,说明是被染色了,是真的吗 蚂蚁庄园今日答案9月18日
- 时间:2026-09-17
-
- 满襟蜡绘花纹巧染就花纹当绣裳说的是哪种传统技艺 蚂蚁新村今日答案2026.9.17
- 时间:2026-09-17
