CodeIgniter表单验证必须显式调用form_validation类的run()并检查返回值,规则需手动set_rules()声明,字段名严格匹配$_POST键,回调函数须为控制器内public方法且以callback_开头,失败时须调用set_message()并返回FALSE,同时手动处理validation_errors()和set_value()以保障用户体验。

CodeIgniter 的数据校验必须走 form_validation 类,不加载、不调用 run()、不检查返回值,验证就等于没做。
set_rules() 必须显式声明每个字段规则
规则不会自动从表单 name 属性或模型字段推导,必须在控制器方法里一条条写清楚。字段名(第一个参数)要和 $_POST 中的 key 完全一致,大小写敏感;第二个参数是错误提示里显示的“字段名”,纯文本,不影响逻辑;第三个参数是规则字符串,用竖线 | 连接。
-
required只检查是否为空(''、null、array()),不校验长度——min_length[3]得单独加 - 内置规则如
valid_email、is_natural_no_zero会自动过滤并类型转换,但不会修改原始值,后续仍需用$this->input->post('field')取值 - 规则顺序影响错误提示优先级:先写的规则先执行,第一个失败就中断,后面规则不触发
- 数组批量写法更易维护:
$this->form_validation->set_rules($rules),其中$rules是关联数组,每项含field、label、rules、errors
callback_ 回调函数必须严格遵循命名与签名约定
自定义逻辑(比如查库判重、密码强度、文件扩展名校验)只能靠回调函数,且不能写在模型或 helper 里——必须是控制器内 public 方法,且以 callback_ 开头。
- 方法名必须和规则中写的完全一致:
callback_check_username_exists对应'callback_check_username_exists',少一个字符或大小写错,run()就静默跳过 - 参数只有一个:
$str,就是该字段当前提交的值,不要在回调里再调$this->input->post() - 失败时必须先调
$this->form_validation->set_message('check_username_exists', '用户名已存在'),再return FALSE;消息键名是callback_后面的部分,不是完整方法名 - 访问数据库或模型必须通过
$this->db或$this->user_model,不能 new 实例或用get_instance(),否则在 CLI 或某些路由下会报Call to a member function on null
validation_errors() 和 set_value() 不是可选项
验证失败后,错误信息不会自动渲染到页面,字段值也不会保留——这两步都得手动做,漏掉一个,用户体验就断层。
-
validation_errors()默认输出带<p>的错误列表,可传参定制包裹标签,如validation_errors('<div class="error">', '</div>') -
set_value('username')必须用在视图的 input value 属性里,否则用户输错后整个表单清空,得重填一遍 - 如果用了
set_data()手动传入验证数据(比如处理 API 请求),set_value()依然有效,它内部会 fallback 到$_POST或你传入的数据 - 中文错误提示需载入语言包:
$this->lang->load('form_validation', 'zh_cn'),文件路径为application/language/zh_cn/form_validation_lang.php
CSRF 和 XSS 过滤必须和验证链一起启用
仅校验格式不等于安全。CSRF token 验证失败会导致 run() 直接返回 FALSE,而 xss_clean 规则会在验证前对字段值做 HTML 实体转义——这两者都得在规则里明确定义,不能只靠配置开关。
- 开启 CSRF 后,表单必须用
form_open()生成,否则隐藏域 token 缺失,run()永远失败 -
xss_clean规则已废弃于 CI4,但在 CI3 中仍可用;若需更强过滤,建议改用htmlspecialchars()或专用库,避免规则链中混用导致意外截断 - CSRF token 在验证失败后自动刷新,所以不要缓存表单 HTML,否则下次提交会因 token 过期被拒
- 所有验证规则(包括
required)都作用于已过滤后的值,即xss_clean会先执行,再进其他规则校验
最容易被忽略的是:验证规则写完后不检查 run() 返回值,直接往下走业务逻辑;或者回调函数里忘了 set_message(),结果 validation_errors() 始终为空——这两处一漏,整个验证流程就形同虚设。


















