在thinkphp3.1中实现表单验证需在模型层定义_validate规则并调用create()触发校验,静态验证通过模型类中声明二维数组规则,动态验证则在控制器中临时传入规则;必须确保字段名与表单name一致(大小写及下划线敏感),且启用token_on可防重复提交。

在ThinkPHP3.1中实现表单验证,需在模型层定义验证规则并配合控制器调用create()方法触发自动校验,不配置验证规则或跳过create直接add会导致所有输入绕过校验直写数据库。
静态验证:在模型类中定义$_validate
第一步:在对应模块的Model目录下新建模型文件,例如UserModel.class.php,继承Model类,并声明protected $_validate属性为二维数组。
第二步:在$_validate数组中逐条写入验证规则,每条规则格式为array(字段名, 验证规则, 错误提示, 验证条件, 附加规则, 验证时间),例如array('username','require','用户名不能为空',1)表示必须填写且立即验证。
第三步:确保字段名与表单name属性完全一致,比如表单中写的是,则验证规则里字段名必须是'email',【大小写和下划线都不能错】,否则该字段永远不会被校验。
第四步:在控制器中使用D()函数实例化该模型,再调用create()方法接收并验证POST数据,验证失败时getError()返回具体错误信息。
动态验证:控制器内临时定义规则
方法一:直接传参给validate()方法
在控制器操作方法中,先获取模型对象(如$User = D('User')),再链式调用$User->validate($rules)->create(),其中$rules是运行时构造的二维数组,结构同静态验证中的$_validate。
方法二:分离验证与创建
先调用$User->validate($rules)设置规则,再单独执行$User->create($_POST)触发验证;这种方式适合需要复用同一组规则校验不同数据源的场景。
注意:动态验证不会写入模型类,每次请求都要重新定义,适合一次性、特殊场景的表单,比如后台临时导出筛选条件校验。
关键验证规则与写法示例
require:非空验证,最常用,写法是array('title','require','标题不能为空')
email:邮箱格式校验,系统内置正则,直接写array('email','email','邮箱格式错误')即可,【不要自己写正则,否则易出错】
confirm:确认字段比对,如密码重复输入,规则为array('pwd2','pwd1','两次密码不一致',0,'confirm'),第三个参数是提示语,第五个参数'confirm'不可省略。
unique:数据库唯一性检查,用于用户名、邮箱等不能重复的字段,写法是array('username','','用户名已存在',0,'unique'),注意中间的验证规则留空,系统自动按字段值查库。
in:限定可选值范围,比如性别只能是'男'或'女',写成array('sex','男,女','性别只能选择男或女',0,'in'),多个值用英文逗号分隔,不能有空格。
启用表单令牌防重复提交
在Conf/config.php中开启TOKEN_ON:'TOKEN_ON'=>true,系统会在模板渲染时自动插入隐藏域。
确保表单使用POST方法提交,且控制器中调用了create()——因为autoCheckToken只在create内部触发,手动add不校验令牌。
如果页面含多个表单,必须在每个form内手动添加{__TOKEN__}标识,否则只有第一个表单能获得有效令牌,其余提交必然报“token error”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











