Codeigniter3表单验证使用required规则与callback回调函数报错问题
问题原因
出现该问题的核心是表单验证规则存在语法错误、规则顺序错误、视图输出语法错误三个问题:
- 控制器
set_rules方法的规则参数语法错误:没有将完整的规则字符串用引号包裹,还在callback前多写了多余的单引号和空格,导致CodeIgniter无法正确解析验证规则,你自定义的必填错误信息也没有生效,才会输出默认的英文必填提示 - 验证规则顺序错误:
trim规则放在了所有验证规则的末尾,会导致先验证内容的规则执行完再修剪空格,如果用户输入的内容前后带空格,会出现前面的规则验证通过,修剪后内容为空的异常 - 视图输入框的
value属性输出存在语法错误,可能导致编辑页加载时原有手机号没有正确填充到输入框,提交时空值触发必填校验
修复步骤
1. 修正控制器的表单验证规则
将规则字符串调整为正确的语法,同时把trim、xss_clean这类数据预处理规则放在最前面,再依次写验证规则:
$this->form_validation->set_rules( 'volasoccel', 'Celular', 'trim|xss_clean|required|numeric|callback_volasoccel_check[tvolasoc.TVOLASOC_CEL]', array('required' => 'Debe ingresar el Celular') );
2. 修正视图输入框语法
修正value属性的输出逻辑,正确输出原有手机号,同时如果不需要HTML5原生的必填校验可以删除原生required属性,避免和CI的验证冲突:
<?php echo form_error('volasoccel' ); ?> <input value="<?php echo $volasoc[0]->Celular; ?>" type="text" name="volasoccel" class="form-control" id="volasoccel" placeholder="Celular">
3. 可选:修正回调函数逻辑
如果修改完上述代码仍然存在异常,检查volasoccel_check回调函数,编辑场景下校验手机号是否重复时,需要排除当前正在编辑的那条数据的ID,不然会把当前数据本身的手机号判定为重复,参考写法:
public function volasoccel_check($cel, $table_field) { list($table, $field) = explode('.', $table_field); // 编辑页需要新增隐藏域存储当前编辑数据的ID $edit_id = $this->input->post('edit_id'); $this->db->where($field, $cel); if($edit_id){ // 排除当前正在编辑的数据 $this->db->where('id !=', $edit_id); } $count = $this->db->count_all_results($table); if($count > 0){ $this->form_validation->set_message('volasoccel_check', '该手机号已被使用'); return FALSE; } return TRUE; }
内容的提问来源于stack exchange,提问作者mcarruitero
相关产品推荐
相关产品推荐

