
在 web 应用开发中,根据用户在表单中的选择来更新数据库是常见的需求。codeigniter 4 提供了一套强大且灵活的工具来处理这类操作,其中推荐的方式是使用其内置的 model 类。本教程将引导您完成从视图层捕获单选按钮输入到控制器处理数据,再到模型层执行数据库更新的整个流程。
1. 视图层:构建带有单选按钮的表单
首先,我们需要一个 HTML 表单来呈现单选按钮,并允许用户进行选择。在 CodeIgniter 4 中,可以使用 form_open_multipart 辅助函数来创建表单,并使用 set_radio 辅助函数来在表单重新加载时保持选中的状态。
关键点:
新视窗企业管理系统是一款小巧、实用、利于后续开发的ASP程序。适合大中小型企业的网站建设。1、新闻管理 2、产品管理 3、订单管理 4、广告管理 5、下载管理 6、留言管理 8、单页栏目(如企业简介,资质荣誉)9、人才招聘等等。 新视窗企业管理系统 5.1 更新日志:1、修改产品列表的图片自动缩略,防止图片变形.2、修改后台添加产品分类时,排序ID不写入数据库的错误.3、修改首页企业简介的链接地址
- action="= base_url('home/savecovid') ?>":确保表单提交到正确的控制器方法。
- name="anotasi1":所有单选按钮都应使用相同的 name 属性,以确保它们属于同一组,并且只有一个可以被选中。
- value="Positif" 等:每个单选按钮的 value 属性是其被选中时将提交到服务器的值。
- = set_radio('anotasi1', 'Positif'); ?>:此辅助函数用于在表单验证失败或重新加载时,自动选中之前用户选择的单选按钮。
- = csrf_field() ?>:CodeIgniter 4 默认启用 CSRF 保护,添加此行是最佳实践,以防止跨站请求伪造攻击。
2. 模型层:定义数据操作
CodeIgniter 4 推荐使用 Model 类来与数据库进行交互。Model 封装了数据库表的逻辑,使得数据操作更加清晰、可维护。
首先,创建一个名为 AnotasiModel 的模型文件(例如 app/Models/AnotasiModel.php):
关键点:
- protected $table = 'tbl_anotasi';:指定模型对应的数据库表。
- protected $primaryKey = 'id';:指定表的主键,这是 update() 方法定位记录的关键。
- protected $allowedFields = ['anotasi'];:这是一个非常重要的安全设置。它定义了哪些字段可以通过 insert() 或 update() 方法批量赋值。未在此列表中定义的字段将不会被更新,有效防止了“批量赋值漏洞”。
3. 控制器层:处理表单提交并调用模型更新数据
控制器负责接收来自表单的数据,进行必要的处理(如验证),然后调用模型来执行数据库操作。
request->getMethod() === 'post') {
// 2. 获取表单数据
$anotasiValue = $this->request->getPost('anotasi1');
$recordId = 1; // 假设我们要更新 ID 为 1 的记录。在实际应用中,这个ID通常会通过URL参数、隐藏字段或会话来获取。
// 3. 数据验证 (强烈建议)
$rules = [
'anotasi1' => 'required|in_list[Positif,Negatif,Netral]'
];
if (! $this->validate($rules)) {
// 验证失败,重定向回表单并显示错误信息
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
}
// 4. 准备更新数据
$data = [
'anotasi' => $anotasiValue
];
// 5. 实例化模型并执行更新
$anotasiModel = new AnotasiModel();
// 使用模型的 update 方法更新数据
// 第一个参数是主键值,第二个参数是包含更新数据的数组
$updateResult = $anotasiModel->update($recordId, $data);
if ($updateResult) {
// 更新成功
return redirect()->to('/')->with('success', '注解信息更新成功!');
} else {
// 更新失败(例如,ID不存在或数据库错误)
return redirect()->back()->with('error', '注解信息更新失败,请重试。');
}
} else {
// 如果不是 POST 请求,则重定向或显示错误
return redirect()->to('/')->with('error', '无效的请求方法。');
}
}
// 假设您有一个方法来显示表单
public function index()
{
return view('home/covid_form');
}
}关键点:
- use App\Models\AnotasiModel;:在控制器顶部引入您创建的模型。
- $anotasiValue = $this->request->getPost('anotasi1');:通过 getPost() 方法获取单选按钮的选中值。anotasi1 是视图中单选按钮的 name 属性。
- $recordId = 1;:非常重要。update() 方法需要一个主键值来确定要更新哪条记录。在实际应用中,这个 ID 不会是硬编码的,它可能来自 URL 段(例如 home/savecovid/1),隐藏表单字段,或者从会话中获取。
- $this->validate($rules):CodeIgniter 4 内置了强大的验证功能。强烈建议在处理任何用户输入之前进行数据验证,以确保数据的完整性和安全性。
- $anotasiModel = new AnotasiModel();:实例化您的模型。
- $anotasiModel->update($recordId, $data);:调用模型的 update() 方法。它接受两个参数:要更新记录的主键值和包含更新数据的关联数组。
4. 路由配置
确保您的路由已正确配置,以便能够访问 Home 控制器中的 savecovid 和 index 方法。
// app/Config/Routes.php
$routes->get('/', 'Home::index'); // 显示表单
$routes->post('home/savecovid', 'Home::savecovid'); // 处理表单提交注意事项与最佳实践
- 数据验证 (Validation): 始终对用户输入进行验证。CodeIgniter 4 的验证库非常强大,可以帮助您轻松定义验证规则。
- 错误处理: 在控制器中,对 update() 方法的返回值进行检查,并根据更新结果向用户提供反馈(成功消息或错误消息)。
- 主键获取: 在实际应用中,用于 update() 方法的 $recordId 不应是硬编码的。它通常通过 URL 段(例如 /users/edit/1),隐藏表单字段,或者从会话中获取。确保这个 ID 来源可靠,以防止未经授权的数据修改。
-
安全防护:
- CSRF 保护: CodeIgniter 4 默认启用 CSRF 保护。在表单中添加 = csrf_field() ?> 是最佳实践。
- SQL 注入: 使用 Model 的 update() 方法会自动对数据进行预处理,有效防止 SQL 注入。避免直接拼接 SQL 字符串。
- 批量赋值漏洞: 在模型中正确设置 $allowedFields 可以有效防止攻击者通过提交额外的表单字段来修改不应被修改的数据库列。
- 使用 Entity 类(可选但推荐): 对于更复杂的数据结构和业务逻辑,CodeIgniter 4 允许您使用 Entity 类来表示数据库记录。Entity 可以包含属性类型转换、默认值和自定义方法,使数据操作更加面向对象和健壮。对于本例中的简单更新,直接使用数组即可,但了解 Entity 是提升代码质量的重要一步。
总结
通过遵循 CodeIgniter 4 的 Model-View-Controller (MVC) 模式,并利用其提供的 Model 类,您可以高效且安全地处理数据库更新操作。本教程展示了如何从视图层捕获单选按钮输入,通过控制器进行处理和验证,最终通过模型将数据更新到数据库。正确地使用 $allowedFields、数据验证和 CSRF 保护是构建健壮和安全 Web 应用程序的关键。









