表单验证“不报错也不通过”通常是因为form_validation未真正运行,最常见原因是控制器未正确接收post数据,导致run()直接返回false;需确认post数据存在、字段名一致、method为post、未被js阻止提交,并在run()为false时调用validation_errors()。

表单验证“不报错也不通过”,基本是 form_validation 没真正跑起来,而不是规则写错了。
为什么 $this->form_validation->run() 总是返回 FALSE
最常见原因是控制器没正确接收 POST 数据——form_validation 默认只校验 $_POST,但如果你的表单用了 GET、AJAX 未设 Content-Type: application/x-www-form-urlencoded,或前端提交时字段名和 set_rules() 中的 field 不一致,它就直接跳过校验,立刻返回 FALSE。
- 用
var_dump($this->input->post())在intelli_email()开头打印,确认数据是否到达控制器 -
set_rules()第一个参数(字段名)必须和 HTML<input name="xxx">的name属性完全一致,大小写敏感 - 确保表单
method="post",且没被 JS 阻止默认提交(比如event.preventDefault()后没手动发请求) - 不要在
run()前调用$this->input->post()多次——CI2/3 的input类对 POST 是单次读取缓存,第二次会返回空
validation_errors() 不显示错误的三个硬性前提
这个函数只输出已触发的错误,前提是:run() 执行过、有规则失败、且错误消息被正确注册。它不会“自动感知”验证失败。
- 必须在
if ($this->form_validation->run() == FALSE)分支里调用validation_errors(),不能只在视图里无条件 echo - 确保
set_rules()的第二个参数(label)不是空字符串,否则validation_errors()可能输出空白或默认占位符 - 如果用了自定义回调(如
callback_rule),必须在回调函数里显式调用$this->form_validation->set_message('rule', 'xxx'),否则不计入错误池
xss_clean 在 CI3 中已废弃,且影响验证流程
CI3.0+ 移除了 xss_clean 规则,继续写会导致整个规则链解析失败,run() 直接返回 FALSE,还不报任何提示。
- 删掉所有规则里的
|xss_clean,改用$this->security->xss_clean()手动过滤输入(仅当真需要) - CI3 默认已开启全局 XSS 过滤(
$config['global_xss_filtering'] = TRUE),但该配置只对$this->input->get/post/cookie()生效,不影响form_validation的规则执行逻辑 - 更安全的做法是:验证通过后再用
html_escape()或esc()(CI4)输出,而非在验证层混入过滤
真正卡住的地方往往不是规则多复杂,而是 POST 数据根本没进验证器,或者错误消息压根没注册进系统——先确认 $this->input->post() 有值,再看 run() 返回值,最后检查 validation_errors() 调用位置,三步下来,90% 的“失效”问题就定位清楚了。











