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