在后台验证数据的时候经常需要对格式、长度、类型验证,这是一个基本的验证方便,操作还是比较方便的:
<?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);
可以自定义加入一些其他的,比如回调、正则等