在往数据表中写入数据时,务必要验证数据的必要性和合法性,防止垃圾数据存入数据表中。这种验证一般都在前端实现,使用javascript和jquery,或者一些验证插件来实现。
但是,我们一定要记录,前端的所有验证都是不可靠的。我们使用前验验证的目的主要是节省服务器压力和网络流量,提交用户的使用效果,仅此而已。普通的黑客就可以轻而易举地绕过前端验证,伪造数据直接访问访问器。
所以,为了安全起见,服务器端也要做验证,起到双重保险的作用。
这就是我们讲验证器的目的。验证器也是一个类文件,要把它定义在模块的validate目录中。
下面来看一下,如何定义验证器
<?php
namespace app\index\validate;
use think\Validate;
//学生验证器
class Student extends Validate
{
//验证规则
protected $rule = [
'no' => 'require|integer',
'name' => 'require',
'sex' => 'require',
'age' => 'integer'
];
//错误信息
protected $message = [
'no.require' => '学号必须',
'no.integer' => '学号必须是数字',
'name' => '姓名必须',
'sex' => '性别必须',
'age' => '年龄必须是数字'
];
}
验证器的名称一般和数据表相同,它有两个属性:$rule 和 $message,分别存放各个字段的验证规则和错误信息.
其中,验证规则最为复杂,详细情况可以参见thinkphp5手册
下面是使用验证器
public function do_add()
{
$data = input('post.');
//实例化模型对象
$stu = new Student();
try{
$ret = $stu->allowField(true)->validate(true)->save($data); //保存数据,返回影响的行数
if(false === $ret){
$this->error($stu->getError());
}else{
$this->success('添加成功',url('index'),'',1);
}
}catch (Exception $ex){
$this->error('保存失败,' . $ex->getMessage());
}
}
在使用模型保存数据前,使用validate(true)进行数据验证,如果验证不通过,返回false;验证通过后才会保存数据。
错误信息可以调用 模型的getError() 获取。
validate(true)会自动调用 当前模型对应的User验证器类进行数据验证。
如果需要调用的验证器类和当前的模型名称不一致,则可以使用
validate('验证器名')
当我们在填写表单时,写入了一些非法数据,如
如:学号 写入了“abc" ,这个数据是不符合要求的,当点击【提交】时,会显示以下页面