在使用tp3的时候,常常用到对于前端传过来的数据进行验证,但tp3这又在model里才会有数据验证层,没有像tp5那样有一个用于作为验证的验证层,所以我写了一个公共函数,用于tp3的数据验证。
//例子
<?php
//数组中第一个参数为提示语,第二个为规则
$rule['name'] = array('姓名不能为空|姓名必须多余5个字符', 'isRequire|minLength:5);
$rule['password'] = array('', 'isRequire); //第一个参数不填的话返回默认错误信息:password字段不能为空
//如果是from-data类型第二个参数可使用param或者post或者get,如果是raw类型的json数据第二个参数使用INPUT
//第三个参数为如果出错了自动返回数据,ajax_return()方法是我自己封装的返回数据格式
$ruleRes = getNewArrayByRule($rule,'POST', true);
$postArray = $ruleRes['data']; //成功获取信息
<?php
/**
*
* 对数据的非空验证验证
* 规则列表:isPhone(判断手机);isInt;isFloat;isPositiveInt;isPhoneNum;isEmail;isArray
* isDuplicateStringInArray;minLength:num;maxLength:num 方法可以自行扩展
*/
/**
* 根据规则获取新的数组
*
* POST,GET,PARAM(获取from-data里的信息)
* INPUT (获取raw里的信息)
* 每个数据经过htmlspecialchars_decode过滤
*
* @param datas array 验证数组
* @param type string 获取信息的类型,默认为获取post值,param为获取输入流的全部信息
* @param goCheck bool 判断是否内部输出错误语句
*
* 数组格式:$data[验证字段] = array('错误时返回的错误提示信息', '规则1|规则二');
*
* 返回数据
* {
"errMsg": "c_name字段为空",
"data": {
"c_name": ""
}
}
*/
function getNewArrayByRule($datas, $type = 'POST', $goCheck = false) {
$datas = array_reverse($datas);
$res['errMsg'] = null; //返回的数据
//JSONstringify可以将对象转换为数组
//如果前端使用json传送的话,前端是传一个对象过来,
//POST是
//传输过去的信息是一个字符串,需要使用json_decode解析为json数组
//如果前端使用from-data传输过来
//并且有一个字段是数组,需要将数组使用json_encode为字符串,存进数据库
//辨别是post,get,输入流获取信息,在tp3的config文件里有一个字段 'DEFAULT_FILTER' => '', //设置tp3数据过滤器(省略后自动动用htmlspecialchars)自动删除特殊字符
switch ($type) {
case 'POST': //只接受from-data
//获取的内容为post信息
$param = I('post.', '', 'htmlspecialchars_decode');
break;
case 'GET' : //只接受from-data
//获取的内容为get信息
$param = I('get.');
break;
case 'PARAM' : //只接受from-data
//获取的内容为输入流
$param = I('param.', '', 'htmlspecialchars_decode');
break;
case 'INPUT' : //json对象 php://input 不能用于 enctype="multipart/form-data"。
//获取json对象
$input = file_get_contents('php://input');
$param = htmlspecialchars_decode($input, true);
break;
default :
//什么都不传,默认为获取全部数据
$input = file_get_contents('php://input');
//并且将特殊字符转换
$param = htmlspecialchars_decode($input, true);
break;
}
//遍历数组
foreach ($datas as $key => $data) {
//判断是否为空,自动根据字段获取对应信息
$value = $param[$key];
//提供数组里对应的提示语句
empty($data[0]) ? : $errMsgs = explode("|", $data[0]);
//第二个字段为判断规则
if (!empty($data[1])) {
//将需要的规则更改成以|分割的字符串
$functionNames = explode("|", $data[1]);
foreach ($functionNames as $k => $functionName) {
//对应自定义规则,根据字符串调用函数,第二个参数为传递的参数
$function = explode(":", $functionName);
//如果是长度方法,max:25|min:10
count($function) == 2 ?
//说明是验证长度的方法
$msg = call_user_func($function[0], $value, $function[1]) :
$msg = call_user_func($functionName, $value);
//根据返回的信息做出提示
if ($msg != null) {
//判断用户是否有提供是对应提示语句
empty($errMsgs[$k]) ? $res['errMsg'] = $key.$msg : $res['errMsg'] = $errMsgs[$k];
//如果出错了,就提示一条语句
break;
}
}
}
//无论信息有没有出错,都data
$res['data'][$key] = $value;
}
if ($goCheck) {
goCheck($res);
}
return $res;
}
//直接输出错误结果
function goCheck($data) {
($data['errMsg'] == null) ? :
ajax_return('', $data['errMsg'], 1, 0, 10000);
}
//------------------ 验证规则 ---------------------//
//非空验证
function isRequire($value, $errMsg = '字段为空') {
//验证规则
($value == '' || $value == null) ? $result = $errMsg : $result = null;
return $result;
}
//整型验证
function isInt($value, $errMsg = '字段不符合整数规则') {
//验证规则
(!is_int($value)) ? $result = $errMsg : $result = null;
return $result;
}
//浮点型验证
function isFloat($value, $errMsg = '字段不符合浮点规则') {
if (!is_float($value)) {
return $errMsg;
}
return null;
}
//正整数验证
function isPositiveInt($value, $errMsg = '字段不符合正数规则') {
$res = isNumeric($value);
if ($res != null) {
return $res;
}
$positiveInt = abs($value);
if (($positiveInt - $value) != 0) {
return $errMsg;
}
return null;
}
//手机验证
function isPhoneNum($value, $errMsg = "字段不符合手机规则") {
$phone = "/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$/";
if(!preg_match($phone, $value)){
return $errMsg;
}
return null;
}
//邮箱验证
function isEmail($value, $errMsg = '字段不符合电子邮箱规则') {
//php自带验证
$result = filter_var($value, FILTER_VALIDATE_EMAIL);
if (!$result) {
return $errMsg;
}
//正则表达式验证
$checkmail="/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/";//定义正则表达式
if(!preg_match($checkmail,$value)){ //用正则表达式函数进行判断
return $errMsg;
}
return null;
}
//数组验证
function isArray($value, $errMsg = '字段不符合数组规则') {
//将信息转化为数组,如果格式不正确,将转换不成功
$value = json_decode($value);
//转换成功后判断
$result = is_array($value);
if (!$result) {
return $errMsg;
}
return null;
}
//重复的字符串在数组中(一维数组)
function isDuplicateStringInArray($array, $errMsg = '字段不是一维数组') {
if (count($array) != 1) {
return $errMsg;
}
// 获取去掉重复数据的数组
$unique_arr = array_unique ( $array );
// 获取重复数据的数组
$repeat_arr = array_diff_assoc ( $array, $unique_arr );
if ($repeat_arr != null) {
$errMsg = '';
foreach ($repeat_arr as $key => $repeat) {
$errMsg = '字段'.$key.'出现重复值'.$repeat.';'.$errMsg;
}
return $errMsg;
}
return null;
}
//判断字符是否符合长度
function minLength($value, $length) {
$errMsg = '字段需要多于' . $length . '字符';
if (mb_strlen($value) < $length) {
return $errMsg;
}
return null;
}
//判断字符是否符合长度
function maxLength($value, $length) {
//上面的方法比下面的方法快
//一个中文等于三个字符
$errMsg = '字段不能多于' . $length . '字符';
if (mb_strlen($value) > $length) {
return $errMsg;
}
return null;
}
function isNumeric($value, $errMsg = '不符合数字规则') {
$result = is_numeric($value);
if (!$result) {
return $errMsg;
}
return null;
}