CodeIgniter 表单验证需手动加载 form_validation 类并配置规则,form_helper 仅生成 HTML 标签;必须调用 set_rules() 定义规则、run() 执行验证、validation_errors() 显示错误、set_value() 回填字段值。

CodeIgniter 的 form_validation 类不是 Form 辅助函数,而是独立的类;form_helper 本身不提供验证能力,只负责生成 HTML 表单标签。
为什么 form_open() 和 form_input() 不校验数据
很多人以为加载了 form_helper 就能自动验证,其实它只是快捷生成 <form>、<input> 这类标签的工具函数,和验证逻辑完全无关。真正做验证的是 form_validation 类,必须手动加载并配置规则。
-
form_helper只处理视图层输出,比如form_input('username')输出一个带 name 的 input 标签 - 验证发生在控制器中:需
$this->load->library('form_validation') - 没调用
$this->form_validation->run(),哪怕规则写全了也等于没验证
验证规则必须在控制器里用 set_rules() 显式定义
CodeIgniter 不支持注解或模型自动映射规则,所有字段校验逻辑都得在控制器方法里一条条写清楚。规则顺序影响错误提示优先级——先写的规则先校验,第一个失败就停。
- 基本写法:
$this->form_validation->set_rules('email', 'Email', 'required|valid_email') - 字段名(第一个参数)必须和
$_POST中的 key 一致,大小写敏感 - 第二个参数是错误提示里的“字段名”,用于拼接如“Email 字段是必需的”
- 第三个参数是规则字符串,多个用竖线分隔;自定义回调函数要加
callback_前缀,如callback_check_username_exists
run() 返回 false 时,validation_errors() 才有内容
这是最容易漏掉的一环:很多新手写了规则但没检查 run() 返回值,直接渲染视图,导致错误信息根本不显示。
- 必须用
if ($this->form_validation->run() === FALSE)判断,注意是严格比较=== FALSE,因为成功时返回TRUE,失败才返回FALSE - 错误信息默认用
<p>包裹,可传参自定义模板,如validation_errors('<div class="error">', '</div>') - 表单字段的值不会自动回填——要用
set_value('username')在form_input()里取上次提交的值,否则用户输错后整个表单清空
中文提示和规则扩展要改配置或重写语言包
默认错误消息是英文,且部分规则(如 min_length[5])括号里的参数不能含中文或空格,否则解析失败。
- 语言文件路径:
application/language/zh_cn/form_validation_lang.php,需手动创建并载入:$this->lang->load('form_validation', 'zh_cn') - 自定义规则函数必须定义在控制器内或通用 helper 中,并确保被加载;回调函数签名必须是
public function callback_xxx($str) -
required对空格字符串(" ")不生效,如需严格非空白,得组合required|trim|min_length[1]
规则写错、run() 没判断、回填值没用 set_value()——这三个点卡住最多人。验证不是“开了开关就跑”,它是一连串必须手动串联的动作。










