各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > phpcms

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

管理员 2022-08-28
phpcms
278
网上所有关于phpcms v9筛选的教程几乎都是一样的,是在phpcmslibsfunctions下的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'])) { 

扫码关注

qrcode

QQ交谈

回顶部