CodeIgniter 3 数据库更新操作的正确写法与常见错误排查
发布时间 - 2025-12-30 00:00:00 点击率:次本文详解 codeigniter 3 中 `update` 操作的规范实现,重点解决因表名传参错误、缺少返回值或条件缺失导致数据被意外清空的问题,并提供安全、可维护的控制器与模型代码范例。
在 CodeIgniter 3 中执行数据库更新操作时,若发现整张表数据被清空(如所有记录字段变为空或默认值),几乎可以确定是 update() 方法调用存在严重逻辑错误——最常见原因包括:表名参数传入错误、WHERE 条件未生效、或误将 $data 当作 SET 子句但实际执行了无条件更新。
回顾原始代码,问题核心在于控制器中调用模型方法时,将表名 'tb_invoice '(注意末尾多余空格)作为第三个参数传入:
$this->Modellaptop->update_client($where, $data, 'tb_invoice ');
而模型方法却未定义接收该参数,导致 CodeIgniter 的 Query Builder 实际执行的是:
$this->db->update('', $data); // 表名为空或无效 → 可能触发异常行为或静默失败更危险的是,若 $this->db->where() 因某种原因未生效(如 $where 为空、类型错误或被前置操作覆盖),$this->db->update() 将对整张表执行无条件更新,把所有记录的指定字段设为提交值(若未提交则为 N
ULL),造成“数据被删光”的假象。
✅ 正确做法是:表名应硬编码在模型中(保障安全性与可读性),控制器只负责传递业务数据和查询条件。同时,模型必须返回影响行数以供控制器校验操作结果。
以下是推荐的重构方案:
✅ 优化后的控制器(Admin.php 或对应控制器):
public function update_() {
$id = $this->input->post('id');
// 强制验证 ID 是否存在且为数字,防止非法请求
if (!$id || !is_numeric($id)) {
$this->session->set_flashdata('message',
'Invalid ID.'
);
redirect('Admin/invoice');
return;
}
$data = [
'nama' => $this->input->post('nama'),
'alamat' => $this->input->post('alamat'),
'number' => $this->input->post('number'),
'rekening' => $this->input->post('rekening'),
'email' => $this->input->post('email')
];
$where = ['id' => $id];
// 调用模型更新,并检查结果
$affected = $this->Modellaptop->update_client($where, $data);
if ($affected > 0) {
$this->session->set_flashdata('message',
'Update successful!'
);
} else {
$this->session->set_flashdata('message',
'No record was updated. Please check ID or data.'
);
}
redirect('Admin/invoice');
}✅ 安全健壮的模型方法(Modellaptop.php):
public function update_client($where = [], $data = []) {
// 防御性检查:确保 where 和 data 非空
if (empty($where) || empty($data)) {
return 0;
}
// 明确指定表名(不从外部传入,避免SQL注入与配置错误)
$table = 'tb_invoice'; // ✅ 建议使用常量或配置项统一管理
$this->db->where($where);
$this->db->update($table, $data);
// 必须返回受影响行数,便于上层判断执行结果
return $this->db->affected_rows();
}? 关键注意事项:
- ❌ 禁止通过控制器动态传入表名(易引发 SQL 注入或拼写错误);
- ✅ 模型中固定表名,并可通过常量(如 self::TABLE_INVOICE)提升可维护性;
- ✅ 始终检查 affected_rows() 返回值,区分“更新成功”、“无匹配记录”、“执行失败”三种状态;
- ✅ 控制器中应对关键输入(如 id)做基础校验,防止空值或恶意参数导致意外行为;
- ? 开发阶段建议开启 CodeIgniter 的数据库调试模式($db['default']['db_debug'] = TRUE;),便于捕获底层 SQL 错误。
遵循以上实践,即可彻底规避“更新变清空”的陷阱,构建稳定可靠的 CRUD 更新逻辑。
# php
# 编码
# session
# ai
# sql注入
# red
# sql
# NULL
# 常量
# default
# this
# 数据库
# 重构
# 的是
# 清空
# 为空
# 整张
# 返回值
# 行数
# 器中
# 子句
# 设为
# 三种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何在阿里云域名上完成建站全流程?
如何快速搭建高效WAP手机网站吸引移动用户?
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Python函数文档自动校验_规范解析【教程】
动图在线制作网站有哪些,滑动动图图集怎么做?
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
使用豆包 AI 辅助进行简单网页 HTML 结构设计
BootStrap整体框架之基础布局组件
如何在阿里云ECS服务器部署织梦CMS网站?
,在苏州找工作,上哪个网站比较好?
如何快速搭建支持数据库操作的智能建站平台?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Android使用GridView实现日历的简单功能
企业网站制作这些问题要关注
JavaScript如何实现倒计时_时间函数如何精确控制
Laravel API资源类怎么用_Laravel API Resource数据转换
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
高端建站三要素:定制模板、企业官网与响应式设计优化
Android自定义控件实现温度旋转按钮效果
如何在IIS中新建站点并解决端口绑定冲突?
JavaScript如何实现路由_前端路由原理是什么
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
网页设计与网站制作内容,怎样注册网站?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
免费网站制作appp,免费制作app哪个平台好?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
zabbix利用python脚本发送报警邮件的方法
深圳网站制作培训,深圳哪些招聘网站比较好?
Android利用动画实现背景逐渐变暗
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
linux写shell需要注意的问题(必看)
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何处理表单验证?(Requests代码示例)
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率

