zoukankan      html  css  js  c++  java
  • php-自动过滤、自动填充、自动验证

    最近又学到了一些新技巧,和大家分享下。

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

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

       

         一、 从表里去获取:使用  '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;
                        }
               
               }
  • 相关阅读:
    PHP实现发送模板消息(微信公众号版)
    laravel 跨域问题
    微信授权登录
    支付demo2
    支付demo1
    微信支付注意点
    微信支付方式区分
    debian,dietpi,linux中文乱码解决方法
    嵌入式应该深入专研STM32还是继续学习linux内核驱动呢?
    arduino下载ESP8266开发板的方法
  • 原文地址:https://www.cnblogs.com/YangJieCheng/p/5708204.html
Copyright © 2011-2022 走看看