因为网站没有做数据的后台验证,只做了前端的js验证,有的浏览器会直接跳过验证存储数据,被老师批评了,这两天学习了thinkphp的自动验证,在这里记录下。
首先验证的基本格式是:
array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])
我在Model里建了一个和表名相同的Model,代码如下,只是简单的不为空验证,手册有其他验证的详细方法
<?php
class Stu_jyModel extends Model {
// 自动验证设置
protected $_validate = array(//这里必须定义为$_validata用来验证
array(
'stu_cgcjxs',
'require',
'请选择出国出境形式(学习/工作)'),
array(
'stu_dwmc',
'require',
'<span style="color:red;">*</span>必填项不能为空'),
array(
'stu_dwzzjgdm',
'/^([0-9A-Z]){8}[0-9|X]$/',
'组织机构代码格式不对,请重新输入',
2),
array(
'stu_dwxzdm',
'require',
'单位性质不能为空'),
array(
'stu_dwhydm',
'require',
'单位所属行业不能为空'),
array(
'stu_gzzwlbdm',
'require',
'工作职位不能为空'),
array(
'stu_dazjdz',
'require',
'档案转寄地址不能为空'),
array(
'stu_cgcjcllx',
'require',
'出国出境材料类型不能为空'),
);
}
?>
接下来是Action里的代码,要对需要存储数据库的数据进行验证
public function fdata1(){
$data['stu_byqxdm']=$_SESSION['byqxid'];
$data['stu_dwmc']=$this->_param('dwmc');
$data['stu_dwzzjgdm']=$this->_param('zzjgdm');
$data['stu_dwxzdm']=$this->_param('dwxz');
$data['stu_dwhydm']=$this->_param('hyfl');
$data['stu_gzzwlbdm']=$this->_param('zwlb');
$data['stu_dwtxdz']=$this->_param('dwtxdz');
$data['stu_dwlxr']=$this->_param('dwlxr');
$data['stu_dwlxdh']=$this->_param('dwlxdh');
$data['stu_dwdzxx']=$this->_param('dwdzxx');
$data['stu_dwzzjgdm']=$this->_param('zzjgdm');
if(I('dwxz')==40){
$data['stu_dwzzjgdm']="";
}else{
if(I('zzjgdm')=="")
$this->error('组织机构代码不能为空','',1);
}
//自动验证
$Stu_jy=D("Stu_jy");
if($Stu_jy->create($data)){
//单位所在地代码
$data['stu_dwszddm']=$this->choosecity(I('locate'));
$this->insert1($data);//调用方法,插入数据
}
else{
$this->error($Stu_jy->getError(),'',1);
}
}
这里验证的关键就是字段名必须要一致,先前在网上找的一直用不了,后来才发现是自己字段名不统一。如果不是用数组存储表单数据后再验证,而是表单提交过来直接验证的话就要注意表单的提交方式必须是post的,字段以标签的name为准,而我现在用的是get,不想改动太大,就只能这样了。