建站帮助

诚信合作, 高质专业!

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

2018-10-18 10:25:06 浏览 我要评论

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

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

Phpcms多条件筛选

价格范围这里,是需要一个数值区间,于是在后台定义一个字段: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 number字段类型

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下面定义字段类型的方法。

 

今天的分享就到这里,希望大家喜欢,希望以后有更多自定义phpcms方法分享,同时欢迎大家投稿,投稿email:info@cmsyou.com。

同时欢迎大家收听CMSYOU官方微博,相互探讨Phpcms

我要收藏
点个赞吧

相关阅读

本月热门

精选推荐

在线客服

扫一扫,关注我们

扫一扫,关注我们