5.0.0 - 致命 - 已处理
Thinkphp版本:5.1.19和5.1.24PHP版本:7.1.18、7.2.8、7.2.9
情况:用PHP 7.2版本时,调用save/saveAll保存数据,其中的浮点型数据存进数据库后会自动变成整型,用PHP 7.1版本可以正确保存浮点型。
发现bug:经过排查,发现是ThinkPHP在获取插入字段绑定类型代码出现错误。
代码位置:\thinkphp\library\think\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;
}修改后正常。资料:https://stackoverflow.com/questions/2718628/pdoparam-for-type-decimal
