表单验证
我们平时处理表单数据,一般包含以下三步:
1.获取数据
2.检验数据合法性
3.根据业务逻辑保存数据
在MicroPHP里面,下面的方法分别对应上面前两个步骤。
1.获取数据
  在控制器和模型里面可以通过:
  $this->readData(Array $map, $source_data = null),根据$map从$source_data中读取数据。
  参数说明:
  $map 字段映射数组,格式:array('表单name名称'=>'表字段名称',...)
  $source_data 数据源,格式:array('表单name名称'=>'值',...),一般是$_POST。
  最后会返回读取后的数据,格式是:array('表字段名称'=>'值',...)。
  比如:
  表单数据:
  标题:$_POST['title'] = ' 文章<a>xxx</a>标题 ';
  内容:$_POST['content']='内容<a>xxx</a>内容,<a onclick="alert();">xxx</a>脚本<script>xxxxx</script>';
  防止跨站token:$_POST['token'] = '09adfu09adfmca09dma0';
  标题和内容对应数据库字段:art_title,art_content
  $map=array('title'=>'art_title','content'=>'art_content');
  然后我们就可以通过$data=$this->readData($map,$_POST),读取到将要插入数据库的数据,当然插入之前要检验数据合法性,也就是下面第2步。
  读到的$data=array('art_title'=>'值','art_content'=>'值'),可以看到把无关的表单字段都过滤掉了。
2.验证数据
  在控制器和模型里面可以通过:
  $this->checkData(Array $rule, Array $data = NULL, &$return_data = NULL, $db = null)进行数据验证。
  提示:
      验证通过返回的是NULL,验证失败返回的是错误信息。
  参数说明:
  $rule 验证规则,格式:array(
                             'key1'=>array(
                                         '规则1'=>'验证失败提示信息',
                                          .....
                                         '规则n'=>'验证失败提示信息'
                                         ),
                             ....
                             'keyn'=>array(
                                         '规则1'=>'验证失败提示信息',
                                          .....
                                         '规则n'=>'验证失败提示信息'
                                         ),
                        )
    $data   需要检验的数据,一般是$this->readData()读取后的数据。
            格式:array('key1'=>'值1',...,'keyn'=>'值n',)
    $return_data 验证通过后,处理过的数据,这个应该是我们最终要使用的数据
    $db     当unique和exists规则验证的数据不是当前默认的数据库连接时,可以指定使用的数据库连接对象。
    示例:
    继续上面1中的数据,为了安全,我们需要检验$data=array('art_title'=>'值','art_content'=>'值')
    首先我们总结下要验证的逻辑:
    1.标题不能为空,过滤html,剔除两边空格,长度最大50字符。
    2.内容不能为空,要进行xss过滤。
    那么我们的验证规则就是$rule=array(
                                  'art_title'=>array(
                                               'set[strip_tags,trim]'=>'',
                                               'required'=>'标题不能为空',
                                               'max_len[50]'=>'标题最多50字符'
                                               ),
                                  'art_content'=>array(
                                               'required'=>'内容不能为空',
                                               'set_post[MpInput::xss_clean]'=>'',
                                               )
                              );
    接着我们就可以通过规则验证$data数据了:
    $ret_data=array();
    $error_msg=$this->checkData($rule,$data,$ret_data);
    if(is_null($error_msg)){
        //验证成功,$ret_data是验证处理过的数据。
        //do sth else
        dump($ret_data);
    }else{
        //验证失败,$error_msg是提示信息
        echo $error_msg;
    }
上面验证规则用到了很多规则,下面是MicroPHP支持的所有规则和用法。
规则名称 功能描述 举例
required 如果元素为空,则返回FALSE
default 当没有post对应字段的值或者值为空的时候那么就会使用默认规则的值作为该字段的值。然后用这个值继续 后面的规则进行验证。 default[默认值]
optional 可以为空规则。例如user字段规则中有optional,当没有传递字段user的值或者值是空的时候, user验证会通过(忽略其它规则即使有required规则), 提示: $this->checkData($rule, $_POST, $ret_data)返回的数据$ret_data, 如果传递了user字段$ret_data就有user字段,反之没有user字段. 如果user传递有值,那么就会用这个值继续后面的规则进行验证。
match 如果表单元素的值与参数中对应的表单字段的值不相等,则返回FALSE match[password2]
equal 如果表单元素的值不与指定的值相等,则返回FALSE equal[snail]
enum 如果表单元素值不在指定的几个值中,则返回FALSE enum[0,1]
unique 如果表单元素的值与指定数据表栏位有重复,则返回False(注:比如unique[user.email],那么验证类会去查找user表中email字段有没有与表单元素一样的值,如存重复,则返回false,这样开发者就不必另写callback验证代码。如果指定了id:1,那么除了id为1之外的记录的email字段不能与表单元素一样,如果一样返回false)
unique[table.field,id:1],其中的id:1支持变量。
比如:id:#user_id,
那么就会使用get或者post的user_id内容作为id内容。
unique[table.field]
unique[table.field,id:1]
exists 规则说明:
(1).如果表单元素的值在指定数据表的字段中不存在则返回false,如果存在返回true
(2).比如exists[cat.cid],那么验证类会去查找cat表中cid字段有没有与表单元素一样的值
(3).cat.cid,cat是表名称(不要带前缀)cid是字段名称。
cat.cid后面还可以指定附加的where条件。
比如:exists[users.uname,user_id:2,...] 可以多个条件,逗号分割。
上面的规则生成的where条件就是array('uname'=>$value,'user_id'=>2,....) exists[table.field,id:1],其中的id:1支持变量。
比如:id:#user_id,
那么就会使用get或者post的user_id内容作为id内容。
exists[table.field]
exists[table.field,id:1]
exists[table.field,id:#id]
min_len 如果表单元素值的字符长度小于参数定义的值,则返回FALSE min_len[8]
max_len 如果表单元素值的字符长度大于参数定义的值,则返回FALSE max_len[8]
range_len 如果表单元素值的字符长度不在指定的范围,则返回FALSE range_len[6,16]
len 如果表单元素值的字符长度不是指定的长度,则返回FALSE len[8]
min 如果表单元素值不是数字或者小于指定的值,则返回FALSE min[8]
max 如果表单元素值不是数字或者大于指定的值,则返回FALSE max[8]
range 如果表单元素值不是数字或者大小不在指定的范围内,则返回 FALSE range[1,10]
alpha 如果表单元素中包含除字母以外的字符,则返回FALSE
alpha_num 如果表单元素中包含除字母和数字以外的字符,则返回FALSE
alpha_dash 如果表单元素值中包含除字母/数字/下划线/破折号以外的其他字符,则返回FALSE
alpha_start 如果表单元素中不是字母开头,则返回FALSE
num 如果表单元素中不是纯数字,则返回FALSE
int 如果表单元素中不是整数,则返回FALSE
float 如果表单元素中不是小数,则返回FALSE
numeric 如果表单元素中不是一个数,则返回FALSE
natural 如果表单元素值中包含了非自然数的其他数值 (其他数值不包括零),则返回FALSE。自然数形如:0,1,2,3....等等。
natural_no_zero 如果表单元素值包含了非自然数的其他数值 (其他数值包括零),则返回FALSE。非零的自然数:1,2,3.....等等。
email 如果表单元素值包含不合法的email地址,则返回FALSE email 必须是email,不能为空
email[true] 必须是email,可以为空
url 如果表单元素值不是一个网址,则返回FALSE url 必须是url,不能为空
url[true] 必须是url,可以为空
qq 如果表单元素值不是一个QQ号,则返回FALSE qq 必须是qq,不能为空
qq[true] 必须是qq,可以为空
phone 如果表单元素值不是一个电话号码,则返回FALSE phone 必须是电话号码,不能为空
phone[true] 必须是电话号码,可以为空
mobile 如果表单元素值不是一个手机号,则返回FALSE mobile 必须是手机号,不能为空
mobile[true] 必须是手机号,可以为空
zipcode 如果表单元素值不是一个邮政编码,则返回FALSE zipcode 必须是邮政编码,不能为空
zipcode[true] 必须是邮政编码,可以为空
idcard 如果表单元素值不是一个身份证号,则返回FALSE idcard 必须是身份证号,不能为空
idcard[true] 必须是身份证号,可以为空
ip 如果表单元素值不是一个合法的IPv4地址,则返回FALSE。 ip 必须是IPv4地址,不能为空
ip[true] 必须是IPv4地址,可以为空
chs 如果表单元素值不是汉字,或者不是指定的长度,则返回FALSE chs 必须是汉字不能为空
chs[false] 必须是汉字,不能为空
chs[true] 必须是汉字,可以为空
chs[false,2] 必须是2个汉字,不能为空
chs[true,2] 必须是2个汉字,可以为空
chs[true,2,3] 必须是2-3个汉字,可以为空
chs[false,2,] 必须是2个以上汉字,不能为空
date 如果表单元素值不是正确的日期格式YYYY-MM-DD,则返回FALSE date 必须是正确的日期格式,不能为空
date[true] 必须是正确的日期格式,可以为空
time 如果表单元素值不是正确的时间格式HH:MM:SS,则返回FALSE time 必须是正确的时间格式,不能为空
time[true] 必须是正确的时间格式,可以为空
datetime 如果表单元素值不是正确的日期时间格式YYYY-MM-DD HH:MM:SS,则返回FALSE datetime 必须是正确的日期时间格式,不能为空
datetime[true] 必须是正确的日期时间格式,可以为空
reg 如果表单元素值不匹配指定的正则表达式,则返回FALSE reg[/^[]]$/]
reg[/^A$/i]
模式修正符说明:
i 表示在和模式进行匹配进不区分大小写
m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
x 表示模式中的空白忽略不计
e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说)
A 以模式字符串开头,相当于元字符^
Z 以模式字符串结尾,相当于元字符$
U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式
set
set_post
如果设置了set,数据在验证的时候验证的是处理过的数据
如果设置了set_post,可以通过第三个参数$data接收数据:$this->checkData($rule, $_POST, $data),$data是验证通过并经过set_post处理后的数据
set和set_post后面是一个或者多个函数或者方法,多个逗号分割
注意:
1.无论是函数或者方法都必须有一个字符串返回
2.如果是系统函数,系统会传递当前值给系统函数,因此系统函数必须是至少接受一个字符串参数
3.如果是自定义的函数,系统会传递当前值和全部数据给自定义的函数,因此自定义函数可以接收两个参数第一个是值,第二个是全部数据$data
4.如果是类的方法写法是:类名称::方法名 (方法静态动态都可以,public,private,都可以)
set[trim]
set_post[sha1,md5]
参数默认分割符 参数默认分割符是逗号, 可以改变这个符号,通过在]后面指定即可。 range[3#5]# 使用#分割参数
自定义的函数
类方法
系统函数
1.无论是函数或者方法都必须有一个字符串返回
2.如果是系统函数,系统会传递当前值给系统函数,因此系统函数必须是至少接受一个字符串参数
3.如果是自定义的函数,系统会传递当前值和全部数据给自定义的函数,因此自定义函数可以接收两个参数第一个是值,第二个是全部数据$data
4.如果是类的方法写法是:类名称::方法名 (方法静态动态都可以,public,private,都可以)
callForTest callForTest接收的第一个参数是表单元素值,第二个是全部表单数据
callForTest [3] callForTest接收的第三个参数就是3
Test_validator::callForTest[3] callForTest接收的第三个参数就是3
md5