0

0

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

碧海醫心

碧海醫心

发布时间:2025-09-13 08:37:01

|

262人浏览过

|

来源于php中文网

原创

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

 '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 (假设)

ASP简单个人、企业网站全站2.0 Beta(含Ajax版) 2.0 Beta
ASP简单个人、企业网站全站2.0 Beta(含Ajax版) 2.0 Beta

功能说明: 1、自带两款企业、个人模板; 2、使用模板生成前台静态htm页面; 3、可自设网站栏目、文章分类; 4、提供用户注册、审核模块(可选是否开放); 5、提供留言模块,以及游客留言(均可选); 6、新增用户站长Mail通知; 7、用户访问记录以及用户下载记录,在线人数显示; 8、文章、栏目日、月、总浏览计数; 9、来访者IP来源查询、更新(请到本站主页下载IP数据库放到Data目录下);

下载
/>Positif
/>Negatif
/>Netral

说明:

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

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

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

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

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

 'required|in_list[Positif,Negatif,Netral]'
    ];
    protected $validationMessages = [
        'anotasi' => [
            'required' => '标注值不能为空。',
            'in_list'  => '标注值必须是 Positif, Negatif 或 Netral 中的一个。'
        ]
    ];
}

app/Views/home/covid_form.php




    
    
    更新标注


    

更新标注信息

getFlashdata('error')): ?>

getFlashdata('error') ?>

getFlashdata('message')): ?>

getFlashdata('message') ?>


/> Positif
/> Negatif
/> Netral

app/Controllers/Home.php

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 保护: 在所有表单中包含 = csrf_field() ?> 以防止跨站请求伪造攻击。
    • 批量赋值保护 ($allowedFields): 严格定义 $allowedFields 数组,只允许更新预期的字段,防止用户恶意修改不应被修改的字段。
  • 动态获取 ID: 在实际应用中,用于更新的记录ID通常不会是硬编码的 1。它可能来自 URL 片段(例如 /home/edit/1 中的 1)、会话数据或另一个表单的隐藏字段。确保以安全的方式获取和传递此ID。
  • 用户反馈: 更新成功或失败后,应通过会话闪存数据(session()->setFlashdata())向用户显示通知消息,然后重定向到合适的页面。

总结

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

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1640

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1075

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

979

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1396

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1226

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1437

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1302

2023.11.13

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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