提问人:OZ1SEJ 提问时间:9/27/2022 最后编辑:DharmanOZ1SEJ 更新时间:9/27/2022 访问量:377
我将PHP MySQL语句更改为预准备语句,并将浮点数从句点更改为逗号
I changed my PHP MySQL statement to a prepared statement, and floats changed decimal point from period to comma
问:
我有一个带有浮点数的MySQL表。在PHPMyAdmin中,它们被列为例如“55.123”
我曾经用它们把它们拉出来
$sql = "SELECT latitude,longitude FROM table WHERE id=" . $id;
$conn->query($sql);
当我打印我的浮标时,我得到例如“55.123”——这并不奇怪。 出于显而易见的原因,我需要将此查询更改为准备好的语句:
$sql = "SELECT latitude,longitude FROM table WHERE id=?;";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i",$id);
$stmt->execute();
现在,当我打印浮点数时,我得到例如“55,123” - 带有逗号而不是句点。
我想我的
setlocale(LC_ALL, 'da_DK.utf8');
可能与此有关,但我真的不知道该怎么办。因为要么我应该停止将我的查询更改为准备好的语句,要么我应该将浮点数转换为字符串并将逗号替换为句点。任何一种解决方案都不太理想。建议?
答:
当您使用预准备语句时,您也在使用 MySQL 本机驱动程序 (MYSQLND)。当它获取MySQL列时,默认情况下,它会将它们作为PHP浮点数而不是字符串返回。因此,在格式化它们时会使用 PHP 的语言环境。FLOAT
这由选项 控制。您可以像以前一样取消设置以获取字符串。MYSQLI_OPT_INT_AND_FLOAT_NATIVE
$conn->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, false);
请注意,必须在创建对象和连接到服务器之间调用此函数。所以你不能用,你必须调用和:mysqli
new mysqli
mysqli_init()
$conn->real_connect()
$conn = mysqli_init();
$conn->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
$conn->real_connect('server', 'user', 'pass', 'database');
评论
这意味着您使用的是旧版本的 PHP。在 PHP 8.0 之前,语言环境设置会影响浮点数到字符串的转换。这意味着,如果你有一个浮点数,并且你使用了类似的东西来输出它,那么到字符串的转换将替换为使用小数分隔符的区域设置。例如echo
.
,
,
setlocale(LC_ALL, "de_DE.UTF-8");
$number = 42.42;
echo $number; // outputs 42,42 in PHP 7
升级到 PHP 8 或更高版本后,无论语言环境如何,输出都应始终相同。
至于为什么mysqli中的预处理查询和非预处理查询之间存在差异:mysqli预处理语句在与数据库通信时使用二进制协议(而不是文本协议)。这意味着从 MySQL 到达的数据已经是整数、浮点数或字符串。已决定默认情况下不会强制转换为字符串。毕竟,这有什么意义呢?但是为了使文本协议与二进制协议兼容,添加了一个选择加入设置,要求 PHP 自动将数字字符串转换为 PHP 原生整数和浮点数。您可以随时通过调用以下命令来启用该设置:
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
二进制协议(预准备语句)忽略此设置。
我不知道为什么设置是选择加入而不是选择退出。PHP 8.1 在 PDO 中改变了这一点,但在 mysqli 中没有。
评论
echo