数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。
数据验证有两种方式:
protected $_validate = array(
/*
array('user', 'require', '用户不得为空!'), //内置验证require,不得为空的用法
array('user', 'email', '邮箱格式不合法!'),//内置验证email,合法的邮箱格式
array('user', 'url', 'URL 路径不合法!'), //内置验证url,验证网址是否合法
array('user', 'currency', '货币格式不正确!'), //内置验证currency,验证是否为货币
array('user', 'zip', '邮政编码格式不正确!'), //内置验证zip,验证是否为六位整数邮政编码
array('user', number, '正整数格式不正确!'), //内置验证number,验证是否为正整数
array('user', 'integer', '整数格式不正确!'), //内置验证integer,验证是否为整数,正负均可
array('user', 'double', '整数格式不正确!'), //内置验证double,验证是否为浮点数,正负均可
array('user', 'english', '不是纯英文!'), //内置验证english,验证是纯英文
array('user', '/^\d{3,6}$/', '不是 3-6 位纯正数字', 0, 'regex'), //附加规则regex,验证3-6位纯数字
array('user', '123', '值不对等', 0, 'equal'), //附加规则equal,验证是否和指定值相等
array('user', '123', '值不能相等', 0, 'notequal'), //附加规则notequal,验证是否与指定值不等
array('user', 'name', '两个用户名对比不同!',0,'confirm'),//附加规则confirm,验证两条字段是否相同
array('user', array(1,2,3), '不在指定范围', 0, 'in'), array('user', '张三,李四,王五', '不在指定范围', 0, 'in'), //附加规则in,某个范围,可以是数组或逗号分割的字符串
array('user', array(1,2,3), '不得在指定范围', 0, 'notin'), array('user', '张三,李四,王五', '不得在指定范围', 0, 'notin'), //附加规则notin,某个范围,可以是数组或逗号分割的字符串
array('user', '3', '不得小于 3 位', 0, 'length'), array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'), //附加规则length,验证长度或数字范围
array('user', array(3,5), '必须是 3-5 之间的数字', 0, 'between'), array('user', '3,5', '必须是 3-5 之间的数字', 0, 'between'),//附加规则between,验证某个范围,数字或逗号字符串
array('user', array(3,5), '必须不是 3-5 之间的数字', 0, 'notbetween'), array('user', '3,5', '必须不是 3-5 之间的数字', 0, 'notbetween'),//附加规则notbetween,验证某个范围,数字或逗号字符串
array('user', '2014-1-10,2015-10-10', '时间已过期', 0, 'expire'), //附加规则expire,设置有效期范围,必须是表单提交有效,可以是时间戳
*/
/* //附加规则callback,回调验证
array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'callback', 3, array(3,5)),
);
//回调方法
protected function checkLength($str,$min,$max) {
preg_match_all("/./u", $str, $matches); $len = count($matches[0]);
if ($len < $min || $len > $max)
{ return false;
} else
{
return true;
} }
*/
//在 Common 文件夹下的 Common 文件夹建立 function.php 文件,会自动加载
array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'function', 3, array(3,5)),);
}
);
public function add(){
$user= D('User');
//数组方式模拟提交
$data['user']='[email protected]';
if ($user->create($data)){
echo '所有字段验证成功';
}else {
var_dump($user->getError());
}
function.php 文件,
protected function checkLength($str,$min,$max) {
preg_match_all("/./u", $str, $matches); $len = count($matches[0]);
if ($len < $min || $len > $max)
{ return false;
} else
{
return true;
} }
*/
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
protected $_validate = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
}
定义好验证规则后,就可以在使用create方法创建数据对象的时候自动调用:
$User = D("User");
if (!$User->create()){
echo '验证所有字段成功!';
}else{
var_dump($user->geterror()); }
静态定义方式因为必须定义模型类,所以只能用D函数实例化模型
默认情况下,create方法是对表单提交的POST数据进行自动验证,数据来源不是表单post,仍然也可以进行自动验证,方法改进如下:
$User = D("User");
$data = getData(); // 通过getData方法获取数据源的(数组)数据
if (!$User->create($data)){
echo '验证所有字段成功!';
}else{
var_dump($user->geterror());
}
一般情况下,create方法会自动判断当前是新增数据还是编辑数据(主要是通过表单的隐藏数据添加主键信息),你也可以明确指定当前创建的数据对象是新增还是编辑,例如:
$User = D("User");
if (!$User->create($_POST,1)){ // 指定新增数据
echo '验证所有字段成功!';
}else{
var_dump($user->geterror());
}
create方法的第二个参数就用于指定自动验证规则中的验证时间,也就是说create方法的自动验证只会验证符合验证时间的验证规则。
我们在上面提到这里的验证时间并非只有这几种情况,你可以根据业务需要增加其他的验证时间,例如,你可以给登录操作专门指定验证时间为4。我们定义验证规则如下:
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
protected $_validate = array(
array('verify','require','验证码必须!'), // 都有时间都验证
array('name','checkName','帐号错误!',1,'function',4), // 只在登录时候验证
array('password','checkPwd','密码错误!',1,'function',4), // 只在登录时候验证
);
}
那么,我们就可以在登录的时候使用
$User = D("User");
if (!$User->create($_POST,4)){
//
登录验证数据
echo '验证所有字段成功!';
}else{
$this->ajaxReturn($User->getError());}
如果采用动态验证的方式,就比较灵活,可以根据不同的需要,在操作同一个模型的时候使用不同的验证规则,例如上面的静态验证方式可以改为:
$rules = array(
array('user', 'require', '用户名不得为空'),
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
$User = M("User");
$data['user']='';
if (!$User->validate($rules)->create()){
echo '验证所有字段成功!';
}else{
var_dump($user->geterror());
}
动态验证不依赖模型类的定义,直接在控制类操作,所以通常用M函数实例化模型就可以
多语言的错误信息提示,可以在验证规则里面如下定义:
protected $_validate = array(
array('verify','require','{%VERIFY_CODE_MUST}'),
array('name','','{%ACCOUNT_EXISTS}',0,'unique',1),
);
其中VERIFY_CODE_MUST
和ACCOUNT_EXISTS
是我们在语言包里面定义的多语言变量。
采用动态验证方式,则比较简单,直接在定义验证规则的时候使用L方法即可,例如:
$rules = array(
array('verify','require',L('VERIFY_CODE_MUST')),
array('name','',L('ACCOUNT_EXISTS'),0,'unique',1),
);
系统支持数据的批量验证功能,只需要在模型类里面设置patchValidate属性为true( 默认为false),
protected $patchValidate = true;
设置批处理验证后,getError()
方法返回的错误信息是一个数组,返回格式是:
array("字段名1"=>"错误提示1","字段名2"=>"错误提示2"... )
前端可以根据需要需要自行处理,例如转换成json格式返回:
$User = D("User");
if (!$User->create()){
} echo '验证所有字段成功!';
else{
$this->ajaxReturn($User->getError());
}