如何在 CodeIgniter 中正确调用控制器方法处理模态框登录表单提交

6次阅读

如何在 CodeIgniter 中正确调用控制器方法处理模态框登录表单提交

本文详解 codeigniter(ci)中模态框登录表单无法触发控制器方法的典型问题,重点指出嵌套表单导致的 html 结构错误,并提供基于 `form_open()` 的标准解决方案、url 路由配置要点及密码安全加固建议。

在使用 CodeIgniter 构建登录功能时,常通过 bootstrap 模态框(Modal)嵌入登录表单。但许多开发者会遇到一个“静默失败”现象:点击提交后模态框直接关闭,既无跳转也无报错,后端控制器方法(如 login_action)完全未被执行。根本原因往往并非路由或数据库逻辑错误,而是html 表单结构被意外破坏

? 问题根源:重复且嵌套的

标签

观察原始代码,你同时使用了两种表单声明方式:

                

这导致浏览器解析出非法嵌套表单

内再嵌套
),而 HTML 规范明确禁止嵌套表单。现代浏览器会自动截断或忽略内层表单,最终仅提交外层空表单(甚至不提交),因此 login_action 方法从未被调用——即使你删除该方法,也不会报错,因为请求根本未抵达控制器。

✅ 正确做法:统一使用 CodeIgniter 表单辅助函数

移除所有原生

标签,仅保留 form_open() / form_close(),并修正 URL 路径:

'form-signin']); ?>

input->get('action') === 'error') { echo "Email atau Kata Sandi salah"; } elseif ($this->input->get('action') === 'notlog') { echo "Anda belum masuk"; } ?>

⚠️ 关键修正说明:删除 和 原生标签;form_open(‘welcome/login_action’) 中不加 index.php/ 前缀,也不加开头 / —— 因为你的 .htaccess 已启用重写,CI 会自动将 welcome/login_action 映射到 index.php/welcome/login_action;添加 required 属性提升前端校验体验;使用数组语法传入 [‘class’ => ‘form-signin’] 设置表单类名,更符合 CI 最佳实践。

?️ 安全增强:弃用 MD5,改用 password_hash() 与 password_verify()

当前控制器中使用 md5($password) 存储密码存在严重安全隐患(碰撞风险高、无盐值、易被彩虹表破解)。请立即升级:

1. 修改模型 m_welcome.php 的插入/注册逻辑(如有):

// 注册时加密 $hashed_password = password_hash($password, PASSWORD_DEFAULT); $this->db->insert('users', ['email' => $email, 'password' => $hashed_password]);

2. 修改 login_action() 中的验证逻辑:

function login_action(){     $email = $this->input->post('email');     $password = $this->input->post('password');      // ✅ 安全查询:只取密码字段用于校验     $user = $this->m_welcome->get_user_by_email($email); // 返回单行对象/数组      if ($user && password_verify($password, $user->password)) {         $data_session = [             'nama'   => $email,             'status' => 'login',             'user_id' => $user->id // 可选:存储 ID 避免后续查库         ];         $this->session->set_userdata($data_session);         redirect('sdm'); // 注意:此处用相对路径,非 base_url()     } else {         redirect('welcome/?action=error');     } }

? 提示:确保模型 get_user_by_email() 方法返回包含 password 字段的结果(如 $this->db->select(‘id, email, password’)->where(’email’, $email)->get(‘users’)->row())。

? 补充检查清单

项目 检查点 说明
.htaccess RewriteRule (.*) index.php/$1 是否生效? 确保 apache mod_rewrite 已启用,且虚拟主机允许 .htaccess 覆盖(AllowOverride All)
config.php $config[‘base_url’] 是否正确? 应为 ‘http://localhost/portalapp/’(末尾带 /),且与实际访问 URL 一致
路由 routes.php 是否覆盖了 welcome/login_action? 默认情况下无需额外配置,CI 自动映射 welcome/login_action → Welcome::login_action()
csrf 若启用了 CSRF 保护,需在表单中添加隐藏字段 security->get_csrf_token_name(), $this->security->get_csrf_hash()); ?>

✅ 总结

解决模态框登录无响应问题的核心在于消除 HTML 表单嵌套,严格采用 CodeIgniter 表单辅助函数构建语义化、可维护的表单结构;同时必须淘汰 md5() 等弱哈希算法,拥抱 PHP 原生 password_hash()/password_verify() 实现密码安全存储与验证。这两项改进不仅能修复当前故障,更能显著提升应用的安全性与可扩展性。

text=ZqhQzanResources