返回旧版| 微信建站| 建站之家论坛| 我要建站 | 建站学习 | 加入收藏
PHPCMS当前位置:首页 > cms教程 > 综合cms > PHPCMS > 正文

phpcms筛选范围不支持浮点型和0开头的范围的bug修复

发布时间:2018-07-02 10:47:10   来源:   点击:
网上所有关于phpcms v9筛选的教程几乎都是一样的,是在phpcms\libs\functions下的extention.func.php添加一些列的筛选函数,但是这些筛选函数都有一个共同的问题,那就是不支持小说点的筛选比如0.1,不支持0开头的范围筛选比如0_10。

原因就是筛选函数在处理数字的时候都统一使用了intval函数,那么这样一来intval(0.1) = 0,inval(0_10) = 0,这样都会被判断成0而造成各种问题。修复方法如下

(1)修改structure_filters_sql函数,改成:
  1. function structure_filters_sql($modelid) { 
  2.     $sql = $fieldname = $min = $max = ''
  3.     $fieldvalue = array(); 
  4.     $modelid = intval($modelid); 
  5.     $model =  getcache('model','commons'); 
  6.     $fields = getcache('model_field_'.$modelid,'model'); 
  7.     $fields_key = array_keys($fields); 
  8.     //TODO 
  9.     $sql = '`status` = \'99\''
  10.     foreach ($_GET as $k=>$r) { 
  11.         if(in_array($k,$fields_key) && floatval($r)!=0 && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) { 
  12.             if($fields[$k]['formtype'] == 'linkage') { 
  13.                 $datas = getcache($fields[$k]['linkageid'],'linkage'); 
  14.                 $infos = $datas['data']; 
  15.                 if($infos[$r]['arrchildid']) { 
  16.                     $sql .=  ' AND `'.$k.'` in('.$infos[$r]['arrchildid'].')';   
  17.                 }    
  18.             } elseif ($fields[$k]['formtype'] == 'box') { 
  19.                  $sql .=" AND  find_in_set($r,$k)";  
  20.             }  
  21.             //elseif($fields[$k]['boxtype']=='checkbox' || $fields[$k]['boxtype']=='multiple') { 
  22.    // $sql .=  " AND `$k` LIKE '%,$r,%'"; 
  23. //} 
  24.             elseif($fields[$k]['rangetype']) { 
  25.                 if(is_numeric($r)) { 
  26.                     $sql .=" AND `$k` = '$r'"
  27.                 } else { 
  28.                     $fieldvalue = explode('_',$r); 
  29.                     $min = floatval($fieldvalue[0])
  30.                     $max = $fieldvalue[1] ? floatval($fieldvalue[1]) : 999999;               
  31.                     $sql .=" AND `$k` >= '$min' AND  `$k` < '$max'"
  32.                 } 
  33.             } else {     
  34.                 $sql .=" AND `$k` = '$r'"
  35.             } 
  36.         } 
  37.     }        
  38.     return $sql; 
代码中加粗甲红的表示修改过的代码

(2)修改不支持0开头的数字筛选

上面代码第11行的代码有个 floatval($r)!=0官方默认的是intval($r)!=0,这两天都硕说明了如果范围是0_100 这种都会被转化成0  而不满足筛选条件,所以只需要去掉这个判断即可,改成:
  1. if(in_array($k,$fields_key) && ($fields[$k]['filtertype'] || $fields[$k]['rangetype'])) { 

相关栏目
热门文章
最新图文
评论排行
版权所有:郑州腾石网络科技有限公司 备案信息:豫ICP备18019117号
站长QQ:2863868475 业务合作咨询:15137100750(同微信)
本站所有投放的广告是有其他网站提供,不代表本站立场,同时网站首页广告位对外出租详情咨询本站站长!同时欢迎广大站长加入个人建站团队
  • 建站客服
  • CMS仿站
  • CMS学习
  • 技术交流群:336572814