一、验证规则
1、验证规则数据验证可以对表单中的字段进行非法验证操作。一般提供了两种验证方式:静态定义($_validate属性)和动态验证(validate()方法)。//验证规则array{ array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]), array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]), …}123456PS:验证字段、验证规则和错误提示这三项是必选的,大多数也是用这三项;而验证条件、附加规则和验证时间是可选的。验证字段:一般来说是表单的字段名,不一定必须和数据表匹配,因为有一些比如密码确认等辅助字段的存在。验证规则:系统内置了常用的规则,require(字段必填)、email(邮箱格式)、url(url格式)、currency(货币)、number(正整数)、integer(整数)、double(浮点数)、zip(邮政编码)、english(英文)。这些规则都默认采用的附加规则是regex,正则表达式验证,只不过是设定好的。错误提示:验证失败后的提示。验证条件:共三种:1)self::EXISTS_VALIDATE或0,表示存在字段就验证(默认)(就是数据提交过来了才进行验证);2)self::MUST_VALIDATE或1,表示必须验证(不论有没有字段都需要验证);3)self::VALUE_VALIDATE或2,表示值不为空的时候验证(就比如邮箱,可填可不填的情况下,填了就验证合法性,没填就直接略过)。123附加规则:配合验证规则使用,包括以下规则:规则 说明regex 正则验证,定义的验证规则是一个正则表达式(默认)function 函数验证,定义的验证规则是一个函数名callback 方法验证,定义的验证规则是当前模型类的一个方法confirm 验证表单中的两个字段是否相同,定义的验证规则是一个字段名equal 验证是否等于某个值,该值由前面的验证规则定义notequal 验证是否不等于某个值,该值由前面的验证规则定义(3.1.2版本新增)in 验证是否在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串notin 验证是否不在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串length 验证长度,定义的验证规则可以是一个数字(表示固定长度)或者数字范围(例如3,12表示长度从3到12的范围)between 验证范围,定义的验证规则表示范围,可以使用字符串或者数组,例如1,31或者array(1,31)notbetween 验证不在某个范围,定义的验证规则表示范围,可以使用字符串或者数组expire 验证是否在有效期,定义的验证规则表示时间范围,可以到时间,例如可用2018-1-15,2019-1-15表示当前提交有效期在2018-1-15到2019-1-15之间,也可以使用时间戳定义ip_allow 验证IP是否允许,定义的验证规则表示允许的IP地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6ip_deny 验证IP是否禁止,定义的验证规则表示禁止的IP地址列表,可用逗号分隔,如192.168.1.1,192.168.1.100unique 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值;当表单数据中包含主键字段时unique不可用于判断主键字段本身验证时间:主要新增修改等验证。1)self::MODEL_INSERT或1表示新增数据时验证;2)self::MODEL_UPDATE或2表示标记数据时验证;3)self::MODEL_BOTH或3表示全部情况下验证(默认)。1232、静态定义在模型类里预先定义好该模型的自动验证规则,就是静态定义。//模型类定义验证规则<?phpnamespace Home\Model;Use Think\Model;class UserModel extends Model{ protected $_validate = array( //分别对应上面的部分,user为字段,require为验证规则,然后是错误提示,验证条件,附加规则,验证时间 array('user','require','用户名不得为空',0,'regex',3), array(), );}?>123456789101112131415为了测试方便,我们直接通过模拟提交POST。//控制器create()方法自动调用验证
u
s
e
r
=
D
(
′
U
s
e
r
′
)
;
user = D('User');
user=D(′User′);data[‘user’] = ‘某某人’;
d
a
t
a
[
′
p
a
s
s
′
]
=
′
12
3
′
;
i
f
(
data['pass'] = '123';if(
data[′pass′]=′123′;if(user->create(KaTeX parse error: Expected '}', got 'EOF' at end of input: …信息 var_dump(user->getError());}12345678910TP框架提供了9种自动验证内置方案,具体如下://内置验证require,非空检测array(‘user’,‘require’,‘用户名不得为空’);12//内置验证email,邮箱格式合法性检测array(‘user’,‘email’,‘邮箱格式不合法’);12//内置验证URL,网址合法性检测array(‘user’,‘url’,‘URL路径不合法’);12//内置验证currency,货币格式检测array(‘user’,‘currency’,‘货币格式不正确’);12//内置zip,邮编格式检测array(‘user’,‘zip’,‘邮政编码格式不正确’);12//内置验证number,正整数检测array(‘user’,‘number’,‘非正整数’);12//内置验证integer,整数验证,正负均可array(‘user’,‘integer’,‘整数格式不正确’);12//内置验证double,验证是否为浮点数array(‘user’,‘double’,‘必须是浮点数’);12//内置验证english,纯英文检测array(‘user’,‘english’,‘不是纯英文’);12TP框架还提供了附加规则,来提示自动验证的扩展性://附加规则regex,验证3-6位纯数字array(‘user’,’/^d{3,6}
/
′
,
′
不
是
3
−
6
位
纯
数
字
′
,
′
0
′
,
′
r
e
g
e
x
′
)
;
12
/
/
附
加
规
则
e
q
u
a
l
,
验
证
是
否
和
指
定
值
相
等
a
r
r
a
y
(
′
u
s
e
r
′
,
′
某
某
某
′
,
′
值
不
对
等
′
,
′
0
′
,
′
e
q
u
a
l
′
)
;
12
/
/
附
加
规
则
n
o
t
e
q
u
a
l
,
验
证
是
否
与
指
定
值
不
等
a
r
r
a
y
(
′
u
s
e
r
′
,
′
某
某
某
′
,
′
值
不
能
对
等
′
,
′
0
′
,
′
n
o
t
e
q
u
a
l
′
)
;
12
/
/
附
加
规
则
c
o
n
f
i
r
m
,
验
证
两
条
字
段
是
否
相
同
/
/
也
可
用
于
密
码
和
重
复
密
码
验
证
a
r
r
a
y
(
′
u
s
e
r
′
,
′
n
a
m
e
′
,
′
两
个
用
户
名
对
比
不
同
′
,
′
0
′
,
′
c
o
n
f
i
r
m
′
)
;
123
/
/
附
加
规
则
i
n
,
某
个
范
围
,
可
以
是
数
组
或
逗
号
分
隔
的
字
符
串
/
/
与
之
对
应
的
是
n
o
t
i
n
a
r
r
a
y
(
′
u
s
e
r
′
,
a
r
r
a
y
(
1
,
2
,
3
)
,
′
不
在
指
定
范
围
′
,
′
0
′
,
′
i
n
′
)
;
a
r
r
a
y
(
′
u
s
e
r
′
,
′
张
三
,
李
四
,
王
五
′
,
′
不
在
指
定
范
围
′
,
′
0
′
,
′
i
n
′
)
;
1234
/
/
附
加
规
则
l
e
n
g
t
h
,
验
证
长
度
或
数
字
范
围
a
r
r
a
y
(
′
u
s
e
r
′
,
′
3
′
,
′
不
得
小
于
3
位
′
,
′
0
′
,
′
l
e
n
g
t
h
′
)
;
a
r
r
a
y
(
′
u
s
e
r
′
,
′
3
,
5
′
,
′
不
得
小
于
3
位
,
不
得
大
于
5
位
′
,
′
0
′
,
′
l
e
n
g
t
h
′
)
;
123
/
/
附
加
规
则
b
e
t
w
e
e
n
,
验
证
某
个
范
围
,
数
字
或
逗
号
字
符
串
/
/
与
之
对
应
的
是
n
o
t
b
e
t
w
e
e
n
a
r
r
a
y
(
′
u
s
e
r
′
,
a
r
r
a
y
(
3
,
5
,
)
,
′
必
须
是
3
−
5
之
间
的
数
字
′
,
′
0
′
,
′
b
e
t
w
e
e
n
′
)
;
a
r
r
a
y
(
′
u
s
e
r
′
,
′
3
,
5
′
,
′
必
须
是
3
−
5
之
间
的
数
字
′
,
′
0
′
,
′
b
e
t
w
e
e
n
′
)
;
1234
/
/
附
加
规
则
e
x
p
i
r
e
,
设
置
有
效
时
间
范
围
,
必
须
是
通
过
表
单
提
交
才
有
效
,
可
以
是
时
间
戳
a
r
r
a
y
(
′
u
s
e
r
′
,
′
2017
−
1
−
1
,
2018
−
1
−
1
′
,
′
时
间
已
过
期
′
,
′
0
′
,
′
e
x
p
i
r
e
′
)
;
12
/
/
附
加
规
则
i
p
d
e
n
y
,
I
P
禁
止
访
问
列
表
/
/
与
之
对
应
的
是
i
p
a
l
l
o
w
−
−
−
−
I
P
允
许
a
r
r
a
y
(
′
u
s
e
r
′
,
′
127.0.0.
1
′
,
′
当
前
I
P
禁
止
′
,
′
0
′
,
′
i
p
d
e
n
y
′
)
;
123
上
面
是
已
经
定
义
好
的
,
如
果
系
统
未
定
义
的
就
是
通
过
其
他
方
法
如
:
/
/
附
加
规
则
c
a
l
l
b
a
c
k
,
回
调
验
证
a
r
r
a
y
(
′
u
s
e
r
′
,
′
c
h
e
c
k
l
e
n
g
t
h
′
,
′
用
户
名
必
须
在
3
−
5
位
′
,
′
0
′
,
′
c
a
l
l
b
a
c
k
′
,
3
,
a
r
r
a
y
(
3
,
5
)
)
;
/
/
回
调
方
法
p
r
o
t
e
c
t
e
d
f
u
n
c
t
i
o
n
c
h
e
c
k
l
e
n
g
t
h
(
/','不是3-6位纯数字','0','regex');12//附加规则equal,验证是否和指定值相等array('user','某某某','值不对等','0','equal');12//附加规则notequal,验证是否与指定值不等array('user','某某某','值不能对等','0','notequal');12//附加规则confirm,验证两条字段是否相同//也可用于密码和重复密码验证array('user','name','两个用户名对比不同','0','confirm');123//附加规则in,某个范围,可以是数组或逗号分隔的字符串//与之对应的是notinarray('user',array(1,2,3),'不在指定范围','0','in');array('user','张三,李四,王五','不在指定范围','0','in');1234//附加规则length,验证长度或数字范围array('user','3','不得小于3位','0','length');array('user','3,5','不得小于3位,不得大于5位','0','length');123//附加规则between,验证某个范围,数字或逗号字符串//与之对应的是notbetweenarray('user',array(3,5,),'必须是3-5之间的数字','0','between');array('user','3,5','必须是3-5之间的数字','0','between');1234//附加规则expire,设置有效时间范围,必须是通过表单提交才有效,可以是时间戳array('user','2017-1-1,2018-1-1','时间已过期','0','expire');12//附加规则ip_deny,IP禁止访问列表//与之对应的是ip_allow ----IP允许array('user','127.0.0.1','当前IP禁止','0','ip_deny');123上面是已经定义好的,如果系统未定义的就是通过其他方法如://附加规则callback,回调验证array('user','checklength','用户名必须在3-5位','0','callback',3,array(3,5));//回调方法protected function checklength(
/′,′不是3−6位纯数字′,′0′,′regex′);12//附加规则equal,验证是否和指定值相等array(′user′,′某某某′,′值不对等′,′0′,′equal′);12//附加规则notequal,验证是否与指定值不等array(′user′,′某某某′,′值不能对等′,′0′,′notequal′);12//附加规则confirm,验证两条字段是否相同//也可用于密码和重复密码验证array(′user′,′name′,′两个用户名对比不同′,′0′,′confirm′);123//附加规则in,某个范围,可以是数组或逗号分隔的字符串//与之对应的是notinarray(′user′,array(1,2,3),′不在指定范围′,′0′,′in′);array(′user′,′张三,李四,王五′,′不在指定范围′,′0′,′in′);1234//附加规则length,验证长度或数字范围array(′user′,′3′,′不得小于3位′,′0′,′length′);array(′user′,′3,5′,′不得小于3位,不得大于5位′,′0′,′length′);123//附加规则between,验证某个范围,数字或逗号字符串//与之对应的是notbetweenarray(′user′,array(3,5,),′必须是3−5之间的数字′,′0′,′between′);array(′user′,′3,5′,′必须是3−5之间的数字′,′0′,′between′);1234//附加规则expire,设置有效时间范围,必须是通过表单提交才有效,可以是时间戳array(′user′,′2017−1−1,2018−1−1′,′时间已过期′,′0′,′expire′);12//附加规则ipdeny,IP禁止访问列表//与之对应的是ipallow−−−−IP允许array(′user′,′127.0.0.1′,′当前IP禁止′,′0′,′ipdeny′);123上面是已经定义好的,如果系统未定义的就是通过其他方法如://附加规则callback,回调验证array(′user′,′checklength′,′用户名必须在3−5位′,′0′,′callback′,3,array(3,5));//回调方法protectedfunctionchecklength(str,
m
i
n
,
min,
min,max){ preg_match_all("/./u",
s
t
r
,
str,
str,matches);
l
e
n
=
c
o
u
n
t
(
len = count(
len=count(matches[0]); if(
l
e
n
<
len<
len<min||
l
e
n
>
len>
len>max){ return false; }else{ return ture; }}12345678910111213//另一种是附加规则function,函数验证array(‘user’,‘checklength’,‘用户名必须在3-5位’,‘0’,‘function’,3,array(3,5));//在Common文件夹下的Common文件夹建立function.php文件,会自动加载function checklength(
s
t
r
,
str,
str,min,KaTeX parse error: Expected '}', got 'EOF' at end of input: …tch_all("/./u",str,$matches);
l
e
n
=
c
o
u
n
t
(
len = count(
len=count(matches[0]); if(
l
e
n
<
len<
len<min||
l
e
n
>
len>
len>max){ return false; }else{ return ture; }}12345678910111213如果有多个字段都包含错误,默认只显示一个错误。 当想显示全部错误的时候,可以说盒子属性//批量验证protected $patchValidate = true;12如果是直接POST过来的,直接用create()方法即可。
2020-04-18
最新推荐文章于 2020-05-04 15:15:42 发布