CI 3.1.8中form_validation失效:为何简单验证始终返回false?
嘿,我之前也踩过CodeIgniter表单验证的坑,先别急着认定是框架bug,咱们从最常见的问题开始排查,大概率能找到原因:
先确认有没有加载表单验证库
你给的代码片段里没看到加载form_validation库的代码,这是最容易忽略的点!不管是在控制器构造函数里,还是在具体的验证方法(比如login)里,都得先调用:$this->load->library('form_validation');没加载库的话,验证逻辑根本跑不起来,自然返回false。
检查表单字段名和验证规则的字段是否完全匹配
比如你验证规则写的是$this->form_validation->set_rules('email', 'Email', 'required');,但前端表单里的input是name="user_email",这种字段名不匹配的情况,框架找不到要验证的数据,直接判定失败。一定要确保两者完全一致,大小写也要注意!确认表单是POST提交
CodeIgniter的表单验证默认只处理POST请求,如果你的表单没加method="post",或者用了GET提交,那验证规则根本不会触发,返回false是必然的。记得在form标签里加上:<form method="post" action="/authentication/login">验证规则语法别写错
比如规则名拼错(把required写成require)、规则之间的竖线|前后加了多余空格(比如'required | valid_email'),这些小细节都会导致规则失效。另外,如果用了自定义规则,也要确认规则函数已经正确定义并注册。如果用了自定义数据源,记得手动设置
如果你不是验证默认的POST数据,而是自己构造的数组,那得先调用$this->form_validation->set_data($your_data);,不然框架找不到验证对象,也会返回false。
举个正确的登录验证示例,你可以对照看看:
public function login() { // 加载表单验证库 $this->load->library('form_validation'); // 设置验证规则 $this->form_validation->set_rules('email', 'Email', 'required|valid_email'); $this->form_validation->set_rules('password', 'Password', 'required'); if ($this->form_validation->run() === FALSE) { // 验证失败,返回登录页面 $this->load->view('auth/login'); } else { // 验证通过,处理登录逻辑 $login_status = $this->user_model->verify_user( $this->input->post('email'), $this->input->post('password') ); if ($login_status) { $this->session->set_userdata('logged_in', true); redirect('pages'); } else { $this->session->set_flashdata('error', 'Invalid credentials'); redirect('authentication/login'); } } }
如果以上都排查过还是有问题,建议开启CodeIgniter的日志功能:在application/config/config.php里把$config['log_threshold']设为2,然后查看application/logs里的日志文件,里面会有表单验证的详细错误信息,帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Khrisna Gunanasurya

