当前位置:首页 > 文章列表 > 文章 > php教程 > CodeIgniter4单选按钮数据库更新教程

CodeIgniter4单选按钮数据库更新教程

2025-09-23 14:31:04 0浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《CodeIgniter 4 单选按钮更新数据库教程》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

CodeIgniter 4:使用模型从单选按钮更新数据库记录

本教程详细指导如何在CodeIgniter 4框架中,利用模型(Model)从前端单选按钮的输入更新数据库记录。文章分析了直接使用Query Builder可能遇到的问题,并提供了基于MVC最佳实践的完整解决方案,包括视图、控制器和模型代码示例,以及关键注意事项,确保数据更新操作的准确性和可维护性。

1. 理解问题:从单选按钮更新数据

在Web应用开发中,通过用户界面(UI)的交互元素(如单选按钮)来修改数据库中的数据是一个常见需求。例如,用户选择一个状态(“阳性”、“阴性”、“中性”),然后点击提交,数据库中对应的记录就应该被更新。

原始代码尝试在控制器中直接使用CodeIgniter 4的Query Builder来更新数据,其核心问题在于:

// 原始控制器代码片段
$builder = $db->table('tbl_anotasi');
$data = [
    'anotasi' => $anotasi1
];
$builder->set('anotasi'); // 这一行是多余的,且不正确的使用方式
$builder->update($data); // 缺少 WHERE 子句,将更新所有记录,或因语法问题失败

这段代码存在两个主要问题:

  1. $builder->set('anotasi'); 这一行是多余的,set() 方法通常用于设置单个字段及其值,或者用于在更新前准备特定的字段值。当使用 update($data) 传入一个关联数组时,set() 并非必需。
  2. 最关键的是,$builder->update($data); 在没有 where() 条件的情况下调用,这会导致Query Builder尝试更新表中的所有记录,或者在某些情况下因缺少更新条件而报错,这显然不是我们想要的效果。更新操作通常需要一个主键或其他唯一标识符来指定要更新哪一行数据。

2. CodeIgniter 4 最佳实践:使用模型进行数据操作

CodeIgniter 4 强烈推荐使用模型(Model)来处理所有与数据库相关的业务逻辑。模型提供了一个抽象层,简化了数据库操作,提高了代码的可读性和可维护性,并遵循了MVC(Model-View-Controller)设计模式的最佳实践。

使用模型的好处包括:

  • 代码组织: 将数据库操作集中在模型中,使控制器保持精简。
  • 简化API: 模型提供了方便的 find(), insert(), update(), delete() 等方法。
  • 数据验证: 可以在模型中定义验证规则。
  • 事件处理: 支持在数据操作前后触发事件。
  • 自动时间戳: 方便地管理 created_at 和 updated_at 字段。

3. 实现步骤:利用模型更新数据

我们将通过以下三个主要步骤来修正并实现通过单选按钮更新数据库记录的功能:创建模型、修改视图以传递记录ID、以及修改控制器来使用模型。

步骤一:创建或修改模型 (Model)

首先,我们需要创建一个模型来管理 tbl_anotasi 表。

文件路径: 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']; // 允许被批量赋值的字段

    // 如果需要自动维护 created_at 和 updated_at 字段
    protected $useTimestamps = false; 
    // protected $createdField  = 'created_at';
    // protected $updatedField  = 'updated_at';
    // protected $deletedField  = 'deleted_at';

    // 验证规则(可选,但推荐)
    // protected $validationRules    = [
    //     'anotasi' => 'required|in_list[Positif,Negatif,Netral]'
    // ];
    // protected $validationMessages = [];
    // protected $skipValidation     = false;
}

说明:

  • $table: 指定模型对应的数据库表名。
  • $primaryKey: 指定表的主键列名,这是 update() 方法用来定位记录的关键。
  • $allowedFields: 非常重要。这是一个数组,列出了允许通过 insert() 或 update() 方法批量赋值的字段。这可以防止“批量赋值漏洞”(Mass Assignment Vulnerability)。

步骤二:修改视图 (View)

为了更新特定的记录,我们需要在表单中包含该记录的唯一标识符(即主键ID)。通常,这通过一个隐藏字段来传递。

文件路径: app/Views/home/covid_form.php (假设)

<form method="post" action="<?= base_url('home/savecovid') ?>">
    <?= csrf_field() ?> <!-- CodeIgniter 4 CSRF 保护 -->

    <div class="form-group">
        <!-- 假设要更新的记录ID为 1 -->
        &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;1&quot;&gt; 

        &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Positif&quot; 
        &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Positif&apos;); ?&gt;/>Positif<br>

        &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Negatif&quot;
        &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Negatif&apos;); ?&gt;/>Negatif<br>

        &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Netral&quot;
        &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Netral&apos;); ?&gt;/>Netral
    </div>
    <button type="submit" name="saveCovid">Submit</button>
</form>

说明:

  • action="": 确保表单提交到正确的控制器方法。
  • : CodeIgniter 4 提供了CSRF(跨站请求伪造)保护。在所有表单中添加此函数以生成隐藏的CSRF令牌。
  • <input type="hidden" name="id" value="1">: 新增的隐藏字段。value 应该动态地设置为你想要更新的记录的实际ID。在实际应用中,这个ID通常是从数据库查询出来,然后传递给视图的。

步骤三:修改控制器 (Controller)

现在,控制器将负责接收表单数据,实例化模型,并调用模型的 update() 方法。

文件路径: app/Controllers/Home.php

<?php

namespace App\Controllers;

use App\Models\AnotasiModel; // 引入我们创建的模型

class Home extends BaseController
{
    public function savecovid()
    {
        // 1. 获取表单数据
        $recordId = $this->request->getPost('id'); // 获取要更新的记录ID
        $anotasiValue = $this->request->getPost('anotasi1'); // 获取单选按钮的值

        // 2. 数据验证(强烈推荐)
        // 这里只是一个简单的示例,实际应用中应使用 CodeIgniter 的验证服务
        if (empty($recordId) || empty($anotasiValue)) {
            // 处理错误,例如重定向回表单并显示错误消息
            return redirect()->back()->with('error', '缺少必要的数据进行更新。');
        }

        // 确保单选按钮的值在允许的范围内
        $allowedAnotasi = ['Positif', 'Negatif', 'Netral'];
        if (!in_array($anotasiValue, $allowedAnotasi)) {
            return redirect()->back()->with('error', '无效的标注值。');
        }

        // 3. 实例化模型
        $anotasiModel = new AnotasiModel();

        // 4. 准备更新数据
        $dataToUpdate = [
            'anotasi' => $anotasiValue
        ];

        // 5. 执行更新操作
        // update($id, $data) 方法会根据 $id 更新对应记录
        $updateResult = $anotasiModel->update($recordId, $dataToUpdate);

        if ($updateResult) {
            // 更新成功
            return redirect()->to(base_url('some_success_page'))->with('message', '数据更新成功!');
        } else {
            // 更新失败,可能是 ID 不存在或数据库错误
            // 可以通过 $anotasiModel->errors() 获取验证错误信息(如果模型中有定义)
            $errors = $anotasiModel->errors();
            return redirect()->back()->with('error', '数据更新失败。' . implode(', ', $errors));
        }
    }
}

说明:

  • use App\Models\AnotasiModel;: 在控制器顶部引入模型。
  • $this->request->getPost('id'): 获取隐藏字段 id 的值。
  • $this->request->getPost('anotasi1'): 获取单选按钮 anotasi1 的值。
  • $anotasiModel = new AnotasiModel();: 实例化模型。
  • $anotasiModel->update($recordId, $dataToUpdate);: 调用模型的 update() 方法。第一个参数是主键值(要更新哪一行),第二个参数是包含要更新字段的关联数组。

4. 完整示例代码

以下是整合后的完整代码示例,展示了如何协同工作:

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';
    protected $useSoftDeletes = false;

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

    protected $useTimestamps = false; // 如果不需要自动维护时间戳,请设置为 false

    // 可选:定义验证规则
    protected $validationRules = [
        'anotasi' => 'required|in_list[Positif,Negatif,Netral]'
    ];
    protected $validationMessages = [
        'anotasi' => [
            'required' => '标注值不能为空。',
            'in_list'  => '标注值必须是 Positif, Negatif 或 Netral 中的一个。'
        ]
    ];
}

app/Views/home/covid_form.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>更新标注</title>
</head>
<body>
    <h1>更新标注信息</h1>

    <?php if (session()->getFlashdata('error')): ?>
        <p style="color: red;"><?= session()->getFlashdata('error') ?></p>
    <?php endif; ?>
    <?php if (session()->getFlashdata('message')): ?>
        <p style="color: green;"><?= session()->getFlashdata('message') ?></p>
    <?php endif; ?>

    <!-- 假设我们要更新 ID 为 1 的记录。在实际应用中,这个 ID 会动态传入。 -->
    <!-- 例如,如果这是一个编辑页面,ID 会通过 URL 参数获取,然后从数据库加载数据,并填充到表单中。 -->
    <?php $recordIdToUpdate = 1; // 示例 ID ?>

    <form method="post" action="<?= base_url('home/savecovid') ?>">
        <?= csrf_field() ?>

        <div class="form-group">
            <label>请选择标注:</label><br>
            <!-- 传递要更新的记录ID -->
            &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;&lt;?= esc($recordIdToUpdate) ?&gt;"> 

            &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Positif&quot; 
            &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Positif&apos;); ?&gt;/> Positif<br>

            &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Negatif&quot;
            &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Negatif&apos;); ?&gt;/> Negatif<br>

            &lt;input type=&quot;radio&quot; name=&quot;anotasi1&quot; value=&quot;Netral&quot;
            &lt;?= set_radio(&apos;anotasi1&apos;,&apos;Netral&apos;); ?&gt;/> Netral
        </div>
        <br>
        <button type="submit" name="saveCovid">提交更新</button>
    </form>
</body>
</html>

app/Controllers/Home.php

<?php

namespace App\Controllers;

use App\Models\AnotasiModel;
use CodeIgniter\Controller; // 引入 Controller 基类

class Home extends BaseController // 确保继承 BaseController
{
    public function index()
    {
        // 渲染表单视图,用于展示单选按钮
        return view('home/covid_form');
    }

    public function savecovid()
    {
        // 1. 获取表单数据
        $recordId = $this->request->getPost('id');
        $anotasiValue = $this->request->getPost('anotasi1');

        // 2. 实例化模型
        $anotasiModel = new AnotasiModel();

        // 3. 准备更新数据
        $dataToUpdate = [
            'anotasi' => $anotasiValue
        ];

        // 4. 执行更新操作,并进行数据验证
        // CodeIgniter Model 的 update() 方法在验证失败时会返回 false
        // 并且可以通过 $anotasiModel->errors() 获取错误信息
        $updateResult = $anotasiModel->update($recordId, $dataToUpdate);

        if ($updateResult) {
            // 更新成功
            return redirect()->to(base_url('home'))->with('message', '数据更新成功!');
        } else {
            // 更新失败,可能是 ID 不存在或验证失败
            $errors = $anotasiModel->errors(); // 获取验证错误
            $errorMessage = '数据更新失败。';
            if (!empty($errors)) {
                $errorMessage .= ' 错误信息:' . implode(', ', $errors);
            } else if (empty($recordId)) {
                $errorMessage = '缺少记录ID,无法进行更新。';
            } else if (!$anotasiModel->find($recordId)) {
                $errorMessage = '指定ID的记录不存在。';
            }
            return redirect()->back()->withInput()->with('error', $errorMessage);
        }
    }
}

数据库结构 (tbl_anotasi):

CREATE TABLE `tbl_anotasi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `anotasi` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 示例数据
INSERT INTO `tbl_anotasi` (`id`, `anotasi`) VALUES
(1, 'Neutral'),
(2, 'Positif');

5. 注意事项与最佳实践

  • 主键的重要性: Model 的 update($id, $data) 方法依赖于 $primaryKey 属性来定位要更新的记录。确保你的表有一个主键,并且在模型中正确配置。
  • 数据验证: 在控制器或模型中对所有用户输入进行验证是至关重要的。模型提供了 validationRules 和 validationMessages 属性,可以方便地定义验证规则。当验证失败时,update() 方法会返回 false,并通过 $model->errors() 获取错误信息。
  • 错误处理: 始终检查 update() 方法的返回值。如果返回 false,则表示更新失败,应向用户提供有意义的反馈。
  • 安全:
    • CSRF 保护: 在所有表单中包含 以防止跨站请求伪造攻击。
    • 批量赋值保护 ($allowedFields): 严格定义 $allowedFields 数组,只允许更新预期的字段,防止用户恶意修改不应被修改的字段。
  • 动态获取 ID: 在实际应用中,用于更新的记录ID通常不会是硬编码的 1。它可能来自 URL 片段(例如 /home/edit/1 中的 1)、会话数据或另一个表单的隐藏字段。确保以安全的方式获取和传递此ID。
  • 用户反馈: 更新成功或失败后,应通过会话闪存数据(session()->setFlashdata())向用户显示通知消息,然后重定向到合适的页面。

总结

通过遵循CodeIgniter 4的MVC架构和模型驱动的数据操作,我们可以更安全、更高效、更可维护地实现数据库更新功能。使用 Model 的 update($id, $data) 方法是处理特定记录更新的标准且推荐方式,它结合了数据验证和批量赋值保护,大大简化了开发过程并提升了应用质量。

今天关于《CodeIgniter4单选按钮数据库更新教程》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

Python异常处理详解:tryexcept用法指南Python异常处理详解:tryexcept用法指南
上一篇
Python异常处理详解:tryexcept用法指南
Golang微服务消息订阅实现详解
下一篇
Golang微服务消息订阅实现详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • PandaWiki开源知识库:AI大模型驱动,智能文档与AI创作、问答、搜索一体化平台
    PandaWiki开源知识库
    PandaWiki是一款AI大模型驱动的开源知识库搭建系统,助您快速构建产品/技术文档、FAQ、博客。提供AI创作、问答、搜索能力,支持富文本编辑、多格式导出,并可轻松集成与多来源内容导入。
    340次使用
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    1123次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    1153次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    1156次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    1225次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码