一个基本的数据验证函数,对输入数据做一个基本的判断

在后台验证数据的时候经常需要对格式、长度、类型验证,这是一个基本的验证方便,操作还是比较方便的:

<?php
/**
 * 数据验证
 * @param $data array 需要验证的数组对象
 * @param $rules array 规则
 * @return array
 * @author blog.alipay168.cn
 */
function check_param(&$data, $rules)
{
    if (empty($data) || !is_array($data) || empty($rules) || !is_array($rules)) {
        return ['code' => -500, 'msg' => '数据或者规则为空'];
    }
    foreach ($rules as $value) {
        if (empty($value['key']) || empty($value['msg']) || empty($value['type'])) {
            return ['code' => -500, 'msg' => '内部错误'];
        }
        switch (strtolower($value['type'])) {
            case 'length':
                if (empty($value['rule'])) {
                    return ['code' => -500, 'msg' => '内部错误'];
                }
                $rule = explode(',', $value['rule']);
                $length = mb_strlen($data[$value['key']]);
                if (count($rule) == 1) {
                    //固定长度
                    if ($length <> intval($rule[0])) {
                        return ['code' => -1, 'msg' => $value['msg']];
                    }
                } else {
                    //长度区间
                    if ($length < intval($rule[0]) || $length > intval($rule[1])) {
                        return ['code' => -1, 'msg' => $value['msg']];
                    }
                }
                break;
            case 'empty':
                if (empty($data[$value['key']])) {
                    return ['code' => -1, 'msg' => $value['msg']];
                }
                break;
            case 'isset':
                if (!isset($data[$value['key']])) {
                    return ['code' => -1, 'msg' => $value['msg']];
                }
                break;
            case 'in_array':
                if (empty($value['rule']) || !is_array($value['rule'])) {
                    return ['code' => -500, 'msg' => '内部错误'];
                }

                if (!in_array($data[$value['key']], $value['rule'])) {
                    return ['code' => -1, 'msg' => $value['msg']];
                }

                break;
            case 'func':
            case 'function':
                if (!is_callable($value['rule'])) {
                    return ['code' => -500, 'msg' => '内部错误'];
                }
                if (!isset($data[$value['key']]) || !$value['rule']($data[$value['key']])) {

                    return ['code' => -1, 'msg' => $value['msg']];
                }
                break;
            case 'min':
                if (!isset($data[$value['key']]) || intval($data[$value['key']]) < intval($value['rule'])) {
                    return ['code' => -1, 'msg' => $value['msg']];
                }
                break;
            case 'max':
                if (!isset($data[$value['key']]) || intval($data[$value['key']]) > intval($value['rule'])) {
                    return ['code' => -1, 'msg' => $value['msg']];
                }
                break;
            default:
                //todo 其他扩展

        }
    }

    return ['code' => 0, 'msg' => 'ok'];
}
//测试
//规则定义
$rule = [
    ['type' => 'length', 'key' => 'name', 'rule' => '2,100', 'msg' => '名称2~100字',],
    ['type' => 'empty', 'key' => 'id', 'rule' => '', 'msg' => 'id不能为空',],
    ['type' => 'min', 'key' => 'count', 'rule' => '1', 'msg' => 'count至少1',],
    ['type' => 'max', 'key' => 'age', 'rule' => '25', 'msg' => '年龄最大25',],
    ['type' => 'func', 'key' => 'rids', 'rule' => 'is_array', 'msg' => 'rids格式不匹配',],
    ['type' => 'in_array', 'key' => 'type', 'rule' => [1, 28, 39], 'msg' => '不支持的类型',],

];

//模拟提交的数据
$param = [
    'name' => '测试',
    'id' => '123',
    'count' => '1',
    'age' => 23,
    'rids' => [123],
    'type' => '12'
];
$ret = check_param($param, $rule);
if ($ret['code'] <> 0) {
    //todo 验证不通过
   
}

print_r($ret);


可以自定义加入一些其他的,比如回调、正则等

评论/留言