codeigniter 2 表单验证必须显式调用 form_validation 类并执行 set_rules()→run()→检查返回值三步,漏任一环均失效;字段名须与 $_post 键严格一致;回调函数需以 callback_ 开头且仅接收 $str 参数;规则按顺序执行,首个失败即中断。

form_validation 类没加载或 run() 没调用,验证就根本不会触发——这是最常被忽略的起点。
验证流程是否完整执行
CodeIgniter 2 的表单验证不是“声明即生效”,必须显式走完三步:set_rules() → run() → 检查返回值。漏掉任意一环,规则都形同虚设。
-
$this->load->library('form_validation')必须在控制器方法开头调用,否则set_rules()会报 Fatal error 或静默失败 -
if ($this->form_validation->run() == FALSE)这个判断不能省;只写$this->form_validation->run()不检查返回值,等于没做验证 - 验证失败后,
validation_errors()不会自动输出到页面,必须手动 echo 或传给视图,否则用户看不到任何提示
字段名与 $_POST 键是否严格一致
规则中第一个参数(field)必须和实际提交的表单字段 name 完全匹配,包括大小写、下划线、中括号语法(如 user[phone]),否则规则压根不应用。
- 检查 HTML 表单:
<input name="email">对应的规则必须是$this->form_validation->set_rules('email', ...),不能写成'Email'或'EMAIL' - 数组字段如
<input name="address[city]">,规则字段名得写成'address[city]',不能简化为'city' - 若用了
set_value('field')填充表单值,它取的也是$_POST['field'],字段名不一致会导致值留空
回调函数命名与签名是否合规
自定义逻辑(比如查重、密码确认)必须用回调函数,但 CodeIgniter 2 对其约束极严:必须是控制器内 public 方法,且以 callback_ 开头。
- 规则里写
'callback_check_email_exists',对应方法名必须是check_email_exists(),不能少callback_前缀,也不能多加下划线 - 方法参数只能有一个:
$str,即该字段当前提交的值;不要在里面再调$this->input->post('email') - 失败时必须先调
$this->form_validation->set_message('check_email_exists', '邮箱已被注册'),再return FALSE;消息键名是去掉callback_后的部分 - 回调里访问模型要用
$this->user_model->check($str),不能 new 实例,否则 CLI 下会崩
规则顺序与内置行为是否理解偏差
规则按书写顺序执行,遇到第一个失败就中断,后续规则不触发;而且部分规则(如 valid_email)会过滤但不修改原始值,容易误判。
-
required只判空(''、null、[]),不判长度——要限制最小长度得额外加min_length[3] -
is_unique[users.email]会直接查库,但字段名必须写成users.email,不能写成email或users_email -
matches[password]比较的是$_POST['password']原始值,不是经过trim或xss_clean处理后的值,所以两个字段都要加相同前置规则 - 批量规则数组写法更可靠:
$rules = array([...], [...]),避免单条set_rules()调用过多导致遗漏
run() 返回 TRUE 却没进 else 分支——说明前面某个条件提前退出了,或者你忘了 redirect() 后没 return,导致后续代码意外执行。











