手机外围滚球的软件:关于Thinkphp在PHP7.2下保存浮点型数据的bug

浏览:435 发布日期:2018/09/11
<足球外围网 id="eb7db7ce4f5ecb846"> <足球外围网 id="ea0cb5324242b850e">
5.0.0 - 致命 - 已处理
Thinkphp版本:5.1.19和5.1.24
PHP版本:7.1.18、7.2.8、7.2.9
情况:用PHP 7.2版本时,调用save/saveAll保存数据,其中的浮点型数据存进数据库后会自动变成整型,用PHP 7.1版本可以正确保存浮点型。

发现bug:经过排查,发现是ThinkPHP在获取插入字段绑定类型代码出现错误。
代码位置:\足球外围网php\library\足球外围网\db\Connection.php
原代码:   public function getFieldBindType($type)
    {
        if (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) {
            $bind = PDO::PARAM_STR;
        } elseif (preg_match('/(int|double|float|decimal|real|numeric|serial|bit)/is', $type)) {
            $bind = PDO::PARAM_INT;
        } elseif (preg_match('/bool/is', $type)) {
            $bind = PDO::PARAM_BOOL;
        } else {
            $bind = PDO::PARAM_STR;
        }

        return $bind;
    }
原代码将浮点型 double|float|decimal 这三种类型也绑定了PDO::PARAM_INT,在7.2测试的两个版本就会强制转成整型。

修改代码如下: public function getFieldBindType($type)
    {
        if (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) {
            $bind = PDO::PARAM_STR;
        } elseif (preg_match('/(double|float|decimal|real|numeric)/is', $type)) {
            $bind = PDO::PARAM_STR;
        } elseif (preg_match('/(int|serial|bit)/is', $type)) {
            $bind = PDO::PARAM_INT;
        } elseif (preg_match('/bool/is', $type)) {
            $bind = PDO::PARAM_BOOL;
        } else {
            $bind = PDO::PARAM_STR;
        }

        return $bind;
    }
修改后正常。

资料:http://www.infinityeverywhere.net/zqwwwz/questions/2718628/pdoparam-for-type-decimal
<足球外围网 id="ad196de4c105c1d8be">
<足球外围网 id="ad6b7d22ed07ed248d">
评论(
后面还有条评论,点击查看>>
<足球外围网 id="e997c2acdc76d56ad">