【PHP】分享一个基于ThinkPHP3.2获取前端数据,并且过滤

在使用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值