Phpcms筛选float字段无法精准查询修正方法

最近的项目中做到多条件筛选,发现在Phpcms v9后台定义的数字字段无法区间查询检索到数据,检查收发现是后台添加数字字段时默认是选择float字段类型,造成不能精准查询,今天CMSYOU在这里与大家分享Phpcms多条件筛选float字段无法精准查询修正方法。

首先我们来看下前台的查询需求:

Phpcms筛选float字段无法精准查询修正方法

价格范围这里,是需要一个数值区间,于是在后台定义一个字段:price,类型为数字number,实际数据库则保存为了float(0,4),也就是浮点字段。

而实际测试中发现这个price字段查询的时候数据结果有误,是不精准的。经过一番研究,才知道:

对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

也就是说,需要精准查询的时候,避免使用float类型,因为float是单精度浮点类型、会导致数据误差,建议用double或者decimal双精度来做。

下面我们来分析下Phpcms v9内置的number字段:

找到phpcms\modules\content\fields\edit.sql.php文件,搜索到:

Phpcms筛选float字段无法精准查询修正方法

case ‘number’:
$minnumber = intval($minnumber);
$defaultvalue = $decimaldigits == 0 ? intval($defaultvalue) : floatval($defaultvalue);
$sql = “ALTER TABLE `$tablename` CHANGE `$oldfield` `$field` “.($decimaldigits == 0 ? ‘INT’ : ‘FLOAT’).” “.($minnumber >= 0 ? ‘UNSIGNED’ : ”).” NOT NULL DEFAULT ‘$defaultvalue'”;
$this->db->query($sql);
break;

也就是说Phpcms默认存number字段存了float,这里就是根源,那么怎么修正多条件筛选float字段无法精准查询呢?

具体方法有三:

1、直接进入数据库修改字段类型:比如使用phpmyadmin工具在线修改。这一方法的好处:直接、看得见,省事。弊端:以后在管理后台不能随意更改这一个字段的属性,避免修改提交时再一次把字段类型变回float。

2、找到根源,直接修改字段类型。具体修改phpcms\modules\content\fields\edit.sql.php文件中关于number的描述。

3、新建一个doublenumber字段类型,在后台模型管理里边单独启用这个类型,这样做的好处是避免影响其他已使用number类型的字段。具体写法思路可以沿用phpcms\modules\content\fields下面定义字段类型的方法。

业界动态

如何理解百度SEO优化的“千人千面”

2018-10-25 16:54:17

业界动态

新媒体文案从取标题开始

2018-10-25 22:52:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索