CodeIgniter模态框表单数据插入失败及验证失效问题求助
排查CodeIgniter模态框表单插入数据库与验证问题
嘿,我看了你的代码,发现几个关键问题导致验证失效和数据无法插入,咱们一步步来修复:
1. 表单验证失败后的错误处理逻辑问题
你的Controller里,当form_validation->run() == FALSE时直接用redirect跳回原页面,这会触发两个致命问题:
- 表单验证的错误信息会直接丢失(因为redirect会重置会话),用户完全看不到自己哪里填错了
- 模态框不会自动重新弹出,用户根本不知道验证失败了,只会觉得点击提交没反应
修复方案:放弃直接redirect,改为加载原页面视图,这样验证错误会保留在会话中,视图可以正常展示:
public function createOrgUsers() { // 如果没在autoload.php里配置表单验证库,先手动加载 $this->load->library('form_validation'); // 设置验证规则,建议给邮箱加上格式验证 $this->form_validation->set_rules('username', 'Username', 'required'); $this->form_validation->set_rules('firstname', 'First Name', 'required'); $this->form_validation->set_rules('lastname', 'Last Name', 'required'); $this->form_validation->set_rules('email', 'Email', 'required|valid_email'); $this->form_validation->set_rules('password', 'Password', 'required'); if ($this->form_validation->run() == FALSE) { // 加载原页面视图,而不是redirect $this->load->view('organisation/view_organisations'); } else { // 准备插入数据,强烈建议给密码加密! $data = array( 'username' => $this->input->post('username'), 'firstname' => $this->input->post('firstname'), 'lastname' => $this->input->post('lastname'), 'email' => $this->input->post('email'), 'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT) ); // 执行插入并判断结果 if ($this->Org_model->orgUsers($data)) { $this->session->set_flashdata('message', 'Data Inserted Successfully'); } else { $this->session->set_flashdata('message', 'Failed to insert data'); } redirect('Organisation/editOrg'); } }
2. 视图中添加验证错误提示
你的模态框视图里完全没有显示验证错误的代码,就算验证失败,用户也看不到问题出在哪。需要给每个输入框下方添加错误提示:
修改后的模态框表单示例(只展示一个字段,其他字段同理):
<div class="modal fade" id="createUser" tabindex="-1" role="dialog" aria-labelledby="createUser" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content" id="modal-content"> <form class="form-horizontal" id="admin-create-user" action="<?php echo base_url(); ?>Organisation/createOrgUsers" method="post" role="form"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">Create New User</h4> </div> <div class="modal-body"> <div class="form-group"> <label for="inputUsername" class="col-sm-4 control-label">Username:</label> <div class="col-sm-7"> <!-- 用set_value保留用户输入内容 --> <input name="username" type="text" class="form-control" id="inputUsername" placeholder="Username" value="<?php echo set_value('username'); ?>"> </div> <!-- 添加错误提示 --> <div class="col-sm-7 col-sm-offset-4 text-danger"> <?php echo form_error('username'); ?> </div> </div> <!-- 其他字段(firstname/lastname/email/password)都按上述方式修改 --> <input type="hidden" name="form_submission" value="admin_registration"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="submit" value="submit" class="btn btn-primary" id="submit3">Create New User</button> </div> </form> </div> </div> </div>
3. 优化Model的插入方法
让Model返回插入结果,方便Controller判断是否插入成功:
function orgUsers($data) { // 返回插入操作的布尔值结果 return $this->db->insert('users', $data); }
4. 验证失败后自动弹出模态框
因为现在验证失败后是加载原视图而非redirect,需要加一段JS,让页面加载时如果有验证错误,自动弹出模态框:
<?php if(validation_errors()): ?> $(document).ready(function() { $('#createUser').modal('show'); }); <?php endif; ?>
这段代码要放在jQuery加载之后,确保能正常执行。
额外检查点
- 确认数据库表
users的字段名和你插入的$data数组键名完全一致(比如有没有拼写错误) - 检查字段类型是否匹配(比如username是不是varchar类型,长度是否足够)
- 密码加密是必须的,绝对不要存储明文密码!
按照这些步骤修改后,你的表单验证应该能正常显示错误提示,数据也能正确插入数据库了。
内容的提问来源于stack exchange,提问作者suresh
相关产品推荐
相关产品推荐

