在我们将提交的表单数据插入或更新到数据库中时,一般都需要对表单数据进行验证,排除不符合我们要求的数据。
Thinkphp为我们提供很好的自动验证方法,在使用create()创建数据对象时会对提交的数据进行自动验证。
静态验证
静态验证是指在模型中预先定义好验证规则,然后在控制器中自动调用该模型进行数据验证。下面介绍下具体步骤:
1.在Model目录中创建model类,类文件名称有严格要求,必须跟数据库表名相关,如 UserModel.class.php (数据库表 user 的类)
namespace Home\Model; use Think\Model; class UserModel extends Model{ protected $_validate = array( array("username","require","用户名必须填写"), array("username","6,18","用户名的长度必须在6到18个字节",0,"length",3), array("email","email","邮箱格式不正确"), ); }
注意:静态验证定义验证规则时,必须使用 protected $_validate = array(); (该成员属性必须用protected 且 属性名称必须是 $_validate)。数组里的验证规则可以参考下面的验证规则。
2.在控制器中,使用create()创建数据对象时,直接默认调用
$user = D("user"); if(!$user->create()){ $this->error($user->getError()); }else{ echo 'success'; }
注意:必须使用 D 实例化数据库表,而不能使用M。例如,用D实例化数据库表 user 时,会同时调用模型类 user。(因此模型类文件名称必须是UserModel.class.php)。另外,用$user->getError() 是获取我们规则里设置的验证不成功的提示信息。
动态验证
使用动态验证比较灵活,不需要创建Model类。只需要在控制器中定义验证规则即可。缺点是动态验证规则只在当前方法中有效,无法重复使用。
//定义动态验证的变量名可以随意设置 $rules = array( array("username","require","用户名必须填写"), array("username","6,18","用户名长度必须在6到18位",1,"length",3), array("email","email","邮箱格式不正确"), ); $user = M("user"); //创建数据对象前,使用validate()进行验证 if(!$user->validate($rules)->create()){ $this->error($user->getError()); }else{ echo 'success'; }
注意:动态验证用M实例化数据库表。
验证规则
验证规则是放在一个二位数组。格式如下
array( array(验证字段1,验证规则,错误提示[,验证条件,附加规则,验证时间]), array(验证字段2,验证规则,错误提示[,验证条件,附加规则,验证时间]), ...... )
1.验证字段(必须):就是提交表单的字段
2.验证规则(必须):验证规则需要跟附加规则一起使用,不过Thinkphp系统也内置几个验证规则,可以直接使用,包括 require(字段必须)、email(验证邮箱格式)、url(验证URL的格式)、currency(货币)、number(数字)
3.错误提示(必须):设置验证失败的提示信息
4.验证条件(可选):包含三种选择
- self::EXISTS_VALIDATE 或者0 存在字段就验证(默认)
- self::MUST_VALIDATE 或者1 必须验证
- self::VALUE_VALIDATE或者2 值不为空的时候验证
5.附加规则(可选):配置验证规则一起使用,有一些的规则类型
规则 | 说明 |
---|---|
regex | 正则验证,定义的验证规则是一个正则表达式(默认) |
function | 函数验证,定义的验证规则是一个函数名 |
callback | 方法验证,定义的验证规则是当前模型类的一个方法 |
confirm | 验证表单中的两个字段是否相同,定义的验证规则是一个字段名 |
equal | 验证是否等于某个值,该值由前面的验证规则定义 |
notequal | 验证是否不等于某个值,该值由前面的验证规则定义(3.1.2版本新增) |
in | 验证是否在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串 |
notin | 验证是否不在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串(3.1.2版本新增) |
length | 验证长度,定义的验证规则可以是一个数字(表示固定长度)或者数字范围(例如3,12 表示长度从3到12的范围) |
between | 验证范围,定义的验证规则表示范围,可以使用字符串或者数组,例如1,31或者array(1,31) |
notbetween | 验证不在某个范围,定义的验证规则表示范围,可以使用字符串或者数组(3.1.2版本新增) |
expire | 验证是否在有效期,定义的验证规则表示时间范围,可以到时间,例如可以使用 2012-1-15,2013-1-15 表示当前提交有效期在2012-1-15到2013-1-15之间,也可以使用时间戳定义 |
ip_allow | 验证IP是否允许,定义的验证规则表示允许的IP地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6 |
ip_deny | 验证IP是否禁止,定义的验证规则表示禁止的ip地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6 |
unique | 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值,当表单数据中包含主键字段时unique不可用于判断主键字段本身 |
6.验证时间(可选):确实是在什么情况下验证,系统默认有三种选择
- self::MODEL_INSERT或者1新增数据时候验证
- self::MODEL_UPDATE或者2编辑数据时候验证
- self::MODEL_BOTH或者3全部情况下验证(默认)