在我们将提交的表单数据插入或更新到数据库中时,一般都需要对表单数据进行验证,排除不符合我们要求的数据。
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全部情况下验证(默认)
