必须显式调用 run() 才触发验证,且需用 === false 判断返回值;set_rules() 三参数顺序不可错位;required 不校验长度,is_unique 字段格式须为 table.field;回调函数须为控制器内 public 方法,命名以 callback_ 开头,仅接收 $str 参数,并手动 set_message;失败后须手动在视图中调用 validation_errors() 和 set_value()。

必须显式调用 run() 才算真正校验
很多开发者写了 set_rules() 就以为验证已生效,其实没调 run(),整个验证流程根本没触发。返回值是布尔型,必须用 if ($this->form_validation->run() === FALSE) 显式判断,不能只写 if (!$this->form_validation->run())——因为 run() 在未加载库或规则为空时可能返回 NULL,会误判为失败。
set_rules() 的三个参数不能错位
第一个参数是字段名,必须和 $_POST 中的 key 完全一致(包括大小写、下划线);第二个参数只是错误提示里显示的名称,纯文本,不影响逻辑;第三个参数是规则字符串,用竖线 | 连接,顺序决定执行优先级。
-
required只判空(''、null、[]),不检查长度,要限制长度得加min_length[3] -
is_unique[users.username]会查数据库,但字段名必须写成table.field格式,少点或大小写错就静默失效 - 回调函数规则如
callback_check_email,对应的方法名必须是check_email,且必须是控制器内public方法
验证失败后,validation_errors() 和 set_value() 得手动塞进视图
CI 不会自动把错误信息渲染到页面,也不会保留用户刚填的值。漏掉任一环节,用户提交失败后看到的就是空白表单,还得重填一遍。
-
validation_errors()默认输出带<p></p>的列表,可传参定制:如validation_errors('<div class="error">', '</div>') -
set_value('email')必须在表单 input 的value属性里显式调用,否则值就丢了 - 如果用了 CSRF,
form_open()必须在视图中调用,否则run()直接返回FALSE
复杂逻辑只能靠 callback_,但签名和调用方式很严格
查库判重、密码强度、文件扩展名等没法用内置规则搞定的,只能写回调函数,但它不是随便放哪都行。
- 方法必须定义在当前控制器内,
public,且名字以callback_开头 - 参数只有一个:
$str,就是该字段当前提交的原始值,不要在里面再调$this->input->post() - 失败时必须先
$this->form_validation->set_message('check_email', '邮箱已被注册')(键名是callback_后面的部分),再return FALSE - 访问模型要用
$this->user_model->check_exists($str),不能new User_model(),否则 CLI 或某些路由下会报Call to a member function on null
run()」和「失败后有没有把 set_value() 塞进每个 input 的 value 属性里」——这两个点一漏,整个验证体验就断掉了。











