本文详解 codeigniter(ci)中模态框登录表单无法触发控制器方法的典型问题,重点指出嵌套表单导致的 html 结构错误,并提供基于 `form_open()` 的标准解决方案、url 路由配置要点及密码安全加固建议。
在使用 CodeIgniter 构建登录功能时,常通过 Bootstrap 模态框(Modal)嵌入登录表单。但许多开发者会遇到一个“静默失败”现象:点击提交后模态框直接关闭,既无跳转也无报错,后端控制器方法(如 login_action)完全未被执行。根本原因往往并非路由或数据库逻辑错误,而是HTML 表单结构被意外破坏。
? 问题根源:重复且嵌套的
标签,仅保留 form_open() / form_close(),并修正 URL 路径:
<div class="modal-body">
<!-- ✅ 正确:仅用 CI 表单辅助函数 -->
<?php echo validation_errors(); ?>
<?php echo form_open('welcome/login_action', ['class' => 'form-signin']); ?>
<p class="text-center text-danger">
<?php
if ($this->input->get('action') === 'error') {
echo "Email atau Kata Sandi salah";
} elseif ($this->input->get('action') === 'notlog') {
echo "Anda belum masuk";
}
?>
</p>
<div class="input-group mb-3">
<input type="email" class="form-control" placeholder="Nama User" name="email" id="email" required>
<div class="input-group-append">
<div class="input-group-text"><span class="fas fa-user"></span></div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" class="form-control" placeholder="Kata Sandi" name="password" id="password" required>
<div class="input-group-append">
<div class="input-group-text"><span class="fas fa-lock"></span></div>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="icheck-primary">
<input type="checkbox" id="remember" name="remember">
<label for="remember">Ingatkan Saya</label>
</div>
</div>
<div class="col-4">
<a tabindex="0" class="btn btn-xs" role="button" data-toggle="modal" data-target="#modalLupa">Lupa Kata Sandi</a>
</div>
</div>
<div class="modal-footer justify-content-between">
<input class="btn btn-lg btn-success btn-block" type="submit" name="submit" value="Masuk">
</div>
<?php echo form_close(); ?>
</div>
⚠️ 关键修正说明:删除 和 原生标签;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) 存储密码存在严重安全隐患(碰撞风险高、无盐值、易被彩虹表破解)。请立即升级: