您的位置:首页 > 编程语言 > PHP开发

php-自动过滤、自动填充、自动验证

2016-07-26 17:14 651 查看
最近又学到了一些新技巧,和大家分享下。

第一、当一个表单有很大内容时,我们在表单处理页面接收这些表单的值的时候就会重复 接收,于是就有了自动过滤的解决之法(核心就是把数据表里需要的字段接收)

   首先:我们要准备数据库的字段,于是就有两个方法

     一、 从表里去获取:使用  'desc table' + mysql_fetch_assoc 接收结果集

                代码:  function __autogv($arr){

              $sql = 'desc test'; $res= mysql_query($sql); $data = array();

              $fileds =  mysql_fetch_assoc($res);

              foreach($fileds as $v){

                if(array_key_exists($v['field'],$arr)){

                  $data[$v['field']] = $_POST[$v['field']];

                }

              }

              return $data;

            }

二、手动添加字段

        function __autogv($arr){

          $fileds = array('t1','t2','t3','t4','t5');

          foreach($arr as $k=>$v){

            if(in_array($k,$fileds)){

                  $data[$k] = $v;

              }

          }

          return $data;

}


自动填充:什么意思呢?就是POST表单里没有数据表里该填内容的字段 比如:数据表 t1 t2 t3 t4 t5 t1 t2 t3 已自动过滤 而 t4 t5 表单里没有 但是 还是需要给它们补充值 ,因此需要自动填充

     

 代码:

          $fillfield = array(

                array('t4','value','0'),//一个填充0

                array('t5','function','time')//一个是时间戳

          )

          function __autofill($data){//$data是自动过滤后的数组

              foreach($fillfield as $v){

                  if(!array_key_exists($v[0],$data)){

                      switch($v[1]){

                            case 'value': $data[$v[0]] = $v[2];break;

                            case 'function':$data[$v[0]]=call_user_func($v[2]);//回调 等同于 $v[2]()

                        }

                  }

              }

              return $data;

        }


自动验证:验证数据的合法性,首先是要以什么为标准的验证,因此第一步应该定下规范(以商品表为例)



$validate = array(
array('goods_name',1,'商品名不能为空','require'),
array('goods_sn',1,'商品序列号不能为空','require'),
array('cat_id',1,'分类必须是大于0的整数','number'),
array('shop_price',1,'价格不能为空,必须是大于0的数','number2'),
array('goods_weight',1,'重量不能为空,必须是大于0的数','number2'),
array('goods_number',1,'库存不能为空,必须大于0,必须是整数','number1'),
array('is_best',2,'只能是1和0','in','0,1'),
array('is_now',2,'只能是1和0','in','0,1'),
array('is_hot',2,'只能是1和0','in','0,1'),
array('goods_brief',3,'10到100个字符的内容','length','10,100')
);

function __autovalid($data){
if(empty($this->validate)){
return true; //如果验证数组是空的 就说明没有可验证的内容
}
foreach($this->validate as $v){
switch($v[1]){
case 1:
if(!isset($data[$v[0]])){
$this->error[] = $v[2];
return false;
}
if(!checkrule($data[$v[0]],$v[3])){//检验失败的话
$this->error[] = $v[2];
return false;
}
break;
case 2:
if(isset($data[$v[0]])){
if(!checkrule($data[$v[0]],$v[3],$v[4])){//检验失败的话
$this->error[] = $v[2];
return false;
}
}
break;
case 3: if(isset($data[$v[0]]) && !empty($data[$v[0]])){
if(!checkrule($data[$v[0]],$v[3],$v[4])){//检验失败的话
$this->error[] = $v[2];
return false;
}

}

break;

}
}
return true;//如果都和法就返回真
}


function checkrule($dval,$rule,$parm=''){
switch($rule){
case 'require':
return !empty($dval);
//验证的是必填字段,goods_name goods_sn  这里的话 goods_name goods_sn 就是不为空 empty返回的是false 取反返回true 就不会走这步了在__autovalid 里 checkrule
case 'number':
//var_dump($dval);
if(is_numeric((int)$dval) &&  $dval > 0 ){
return true;
}else{
return false;
}
case  'number1':
//var_dump(is_string($dval));
if(is_numeric($dval) && is_int((int)$dval) && $dval > 0){
//echo $dval;
return true;
}else{
return false;
}
case 'number2':
if(is_numeric($dval) && $dval > 0){
return true;
}else{
return false;
}
case 'in':
$tmp = explode(',',$parm);
return in_array($dval,$tmp);
case 'length':
$tmp = explode(',',$parm);
list($min,$max) = $tmp;

return mb_strlen($dval,'utf-8') >= $min && strlen($dval) <= $max;
default:
return false;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: