我有一个带有浮动的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');可能和这事有关,但我真的不知道该怎么做。因为要么我应该停止将查询更改为准备好的语句,要么我应该将浮点数转换为字符串并用句点替换逗号。这两种解决方案都不太理想。有什么建议吗?
发布于 2022-09-27 12:18:59
这意味着您使用的是PHP的旧版本。在PHP8.0之前,地区设置影响了将浮点数转换为字符串。这意味着,如果您有一个浮点数,并且使用了类似于echo的东西输出它,那么对于使用,作为小数分隔符的区域设置,向string的转换将替换为,。例如:
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);二进制协议(准备好的语句)忽略此设置。
我不知道为什么设置是选择而不是选择退出。PHP8.1在PDO中改变了这一点,但在mysqli中没有改变。
发布于 2022-09-26 20:37:09
当您使用准备好的语句时,您还使用了MySQL本机驱动程序(MYSQLND)。当它获取MySQL FLOAT列时,默认情况下它会以PHP而不是字符串的形式返回它们。因此,在格式化它们时使用PHP的区域设置。
这是由选项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');https://stackoverflow.com/questions/73859546
复制相似问题