
本文详解 codeigniter(ci)中模态框登录表单无法触发控制器方法的典型问题,重点指出嵌套表单导致的 html 结构错误,并提供基于 `form_open()` 的标准解决方案、url 路由配置要点及密码安全加固建议。
在使用 CodeIgniter 构建登录功能时,常通过 bootstrap 模态框(Modal)嵌入登录表单。但许多开发者会遇到一个“静默失败”现象:点击提交后模态框直接关闭,既无跳转也无报错,后端控制器方法(如 login_action)完全未被执行。根本原因往往并非路由或数据库逻辑错误,而是html 表单结构被意外破坏。
? 问题根源:重复且嵌套的
✅ 正确做法:统一使用 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() 实现密码安全存储与验证。这两项改进不仅能修复当前故障,更能显著提升应用的安全性与可扩展性。