CodeIgniter 4 中使用单选按钮更新数据库表的教程

碧海醫心
发布: 2025-09-13 12:15:10
原创
368人浏览过

CodeIgniter 4 中使用单选按钮更新数据库表的教程

本教程详细介绍了如何在 CodeIgniter 4 框架中,利用单选按钮(Radio Button)的用户输入来更新数据库表。文章将重点讲解如何通过推荐的 Model-Entity 模式实现数据更新,包括控制器(Controller)中处理表单提交、模型(Model)中执行数据库操作的步骤,并提供清晰的代码示例和最佳实践建议,确保数据操作的效率与安全性。

在 web 应用开发中,根据用户在表单中的选择来更新数据库是常见的需求。codeigniter 4 提供了一套强大且灵活的工具来处理这类操作,其中推荐的方式是使用其内置的 model 类。本教程将引导您完成从视图层捕获单选按钮输入到控制器处理数据,再到模型层执行数据库更新的整个流程。

1. 视图层:构建带有单选按钮的表单

首先,我们需要一个 HTML 表单来呈现单选按钮,并允许用户进行选择。在 CodeIgniter 4 中,可以使用 form_open_multipart 辅助函数来创建表单,并使用 set_radio 辅助函数来在表单重新加载时保持选中的状态。

<!-- app/Views/home/covid_form.php 或其他视图文件 -->
<form method="post" action="<?= base_url('home/savecovid') ?>">
    <?= csrf_field() ?> <!-- 强烈建议添加CSRF保护 -->
    <div class="form-group">
        <label>请选择注解状态:</label><br>
        <input type="radio" name="anotasi1" value="Positif" 
               <?= set_radio('anotasi1', 'Positif'); ?>/> Positif<br>
        <input type="radio" name="anotasi1" value="Negatif"
               <?= set_radio('anotasi1', 'Negatif'); ?>/> Negatif<br>
        <input type="radio" name="anotasi1" value="Netral"
               <?= set_radio('anotasi1', 'Netral'); ?>/> Netral
    </div>
    <button type="submit" name="saveCovid">提交</button>
</form>
登录后复制

关键点:

表单大师AI
表单大师AI

一款基于自然语言处理技术的智能在线表单创建工具,可以帮助用户快速、高效地生成各类专业表单。

表单大师AI 74
查看详情 表单大师AI
  • action="zuojiankuohaophpcn?= 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):

<?php namespace App\Models;

use CodeIgniter\Model;

class AnotasiModel extends Model
{
    protected $table      = 'tbl_anotasi'; // 数据库表名
    protected $primaryKey = 'id';    // 表的主键,假设为 'id'

    protected $useAutoIncrement = true; // 主键是否自增

    protected $returnType     = 'array'; // 默认返回类型可以是 'array' 或 'object'
    protected $useSoftDeletes = false; // 是否使用软删除

    protected $allowedFields = ['anotasi']; // 允许更新的字段

    // Dates
    protected $useTimestamps = false; // 是否使用时间戳字段 (created_at, updated_at, deleted_at)
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    // Validation
    protected $validationRules    = [];
    protected $validationMessages = [];
    protected $skipValidation     = false;
    protected $cleanValidationRules = true;

    // Callbacks
    protected $allowCallbacks = true;
    protected $beforeInsert   = [];
    protected $afterInsert    = [];
    protected $beforeUpdate   = [];
    protected $afterUpdate    = [];
    protected $beforeFind     = [];
    protected $afterFind      = [];
    protected $beforeDelete   = [];
    protected $afterDelete    = [];
}
登录后复制

关键点:

  • protected $table = 'tbl_anotasi';:指定模型对应的数据库表。
  • protected $primaryKey = 'id';:指定表的主键,这是 update() 方法定位记录的关键。
  • protected $allowedFields = ['anotasi'];:这是一个非常重要的安全设置。它定义了哪些字段可以通过 insert() 或 update() 方法批量赋值。未在此列表中定义的字段将不会被更新,有效防止了“批量赋值漏洞”。

3. 控制器层:处理表单提交并调用模型更新数据

控制器负责接收来自表单的数据,进行必要的处理(如验证),然后调用模型来执行数据库操作。

<?php namespace App\Controllers;

use App\Models\AnotasiModel; // 引入模型
use CodeIgniter\Controller;

class Home extends Controller
{
    public function savecovid()
    {
        // 1. 检查是否为 POST 请求
        if ($this->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'); // 处理表单提交
登录后复制

注意事项与最佳实践

  1. 数据验证 (Validation): 始终对用户输入进行验证。CodeIgniter 4 的验证库非常强大,可以帮助您轻松定义验证规则。
  2. 错误处理: 在控制器中,对 update() 方法的返回值进行检查,并根据更新结果向用户提供反馈(成功消息或错误消息)。
  3. 主键获取: 在实际应用中,用于 update() 方法的 $recordId 不应是硬编码的。它通常通过 URL 段(例如 /users/edit/1),隐藏表单字段,或者从会话中获取。确保这个 ID 来源可靠,以防止未经授权的数据修改。
  4. 安全防护:
    • CSRF 保护: CodeIgniter 4 默认启用 CSRF 保护。在表单中添加 <?= csrf_field() ?> 是最佳实践。
    • SQL 注入: 使用 Model 的 update() 方法会自动对数据进行预处理,有效防止 SQL 注入。避免直接拼接 SQL 字符串。
    • 批量赋值漏洞: 在模型中正确设置 $allowedFields 可以有效防止攻击者通过提交额外的表单字段来修改不应被修改的数据库列。
  5. 使用 Entity 类(可选但推荐): 对于更复杂的数据结构和业务逻辑,CodeIgniter 4 允许您使用 Entity 类来表示数据库记录。Entity 可以包含属性类型转换、默认值和自定义方法,使数据操作更加面向对象和健壮。对于本例中的简单更新,直接使用数组即可,但了解 Entity 是提升代码质量的重要一步。

总结

通过遵循 CodeIgniter 4 的 Model-View-Controller (MVC) 模式,并利用其提供的 Model 类,您可以高效且安全地处理数据库更新操作。本教程展示了如何从视图层捕获单选按钮输入,通过控制器进行处理和验证,最终通过模型将数据更新到数据库。正确地使用 $allowedFields、数据验证和 CSRF 保护是构建健壮和安全 Web 应用程序的关键。

以上就是CodeIgniter 4 中使用单选按钮更新数据库表的教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号