本文详解 codeigniter 中模态登录表单无法触发控制器方法的常见原因(如嵌套表单、url 路由错误、`.htaccess` 配置冲突),并提供完整修复方案,包括表单重构、安全密码哈希升级及调试要点。
在使用 CodeIgniter 构建登录模态框时,表单提交后“无响应”或直接关闭模态框,通常并非逻辑错误,而是 html 结构与框架路由机制不匹配所致。最典型的问题出现在你提供的代码中:同时使用了原生
,导致浏览器解析出非法的嵌套表单结构(HTML 规范禁止嵌套
请彻底移除原生
@@##@@"> 'form-signin']); ?> input->get('action'); if ($action === 'error') echo "Email atau Kata Sandi salah"; elseif ($action === 'notlog') echo "Anda belum masuk"; ?> Ingatkan Saya Lupa Kata Sandi Masuk
input->get('action'); if ($action === 'error') echo "Email atau Kata Sandi salah"; elseif ($action === 'notlog') echo "Anda belum masuk"; ?>
⚠️ 关键修正点:删除 和 原生标签;form_open(‘welcome/login_action’) 中 不加 index.php/,也不加前导 / —— 因你的 .htaccess 已启用重写,CI 会自动将请求映射到 Welcome::login_action();添加 required 属性增强前端校验;将提交按钮改为 ,语义更清晰。
当前控制器中使用 md5($password) 存储密码存在严重安全隐患(碰撞风险高、无盐值、已被淘汰)。请立即升级为 PHP 原生密码哈希方案:
1. 修改模型 m_welcome.php 的注册/登录逻辑:
// 注册时(示例) public function register_user($data) { $data['password'] = password_hash($data['password'], PASSWORD_ARGON2ID); // 或 PASSWORD_DEFAULT return $this->db->insert('users', $data); } // 登录验证时 public function check_login($email) { return $this->db->where('email', $email)->get('users'); }
2. 更新 Welcome.php 中的 login_action():
function login_action(){ $email = $this->input->post('email'); $password = $this->input->post('password'); // ✅ 改为先查用户,再验证密码(避免 SQL 注入风险) $query = $this->m_welcome->check_login($email); if ($query->num_rows() > 0) { $user = $query->row(); if (password_verify($password, $user->password)) { // ✅ 安全比对 $data_session = [ 'nama' => $user->nama, // 建议存真实姓名而非 email 'email' => $user->email, 'status' => 'login' ]; $this->session->set_userdata($data_session); redirect('sdm'); // 注意:此处应为相对 URI,非 base_url() } else { redirect('welcome/?action=error'); } } else { redirect('welcome/?action=error'); } }
遵循以上规范,你的模态登录表单即可稳定调用控制器逻辑,同时兼顾安全性与可维护性。
Multiprocessing 中嵌套对象间安全共享数据的完整实践指南
如何优雅地在二维复数数组中找到模最大的复数值