【发布时间】:2020-07-04 07:02:18
【问题描述】:
我需要在我的表中插入一个浮点数。我使用 SafeMySQL,所以我需要在查询中使用 ?s 来输入 FLOAT 数。我试过的:
$db -> query("INSERT INTO tablename(`certs`) VALUES(?s)", 4.123); // inserts 4
$db -> query("INSERT INTO tablename(`certs`) VALUES(?s)", floatval(4.123)); // inserts 4
$db -> query("INSERT INTO tablename(`certs`) VALUES(?s)", (string)4.123); // inserts 4
$db -> query("INSERT INTO tablename(`certs`) VALUES(?s)", '4.123'); // inserts 4.123
$db -> query("INSERT INTO tablename(`certs`) VALUES(4.123)"); // inserts 4.123
这也发生在所有其他表上。因此,要使用 SafeMySQL 插入 FLOAT,我必须将我的浮点数转换为字符串,或者在查询中插入纯值(这看起来与 SafeMySQL 的用途完全相反)。这看起来非常荒谬,我在网上找不到任何信息。
我只想插入一个 FLOAT 数字,我错过了什么吗?这里有什么问题? xD
谢谢!
【问题讨论】:
-
我从未听说过 safemysql,我建议您使用 prepared statements 的标准方式。 '这至少是安全的
-
嗨,根据您的最后一行示例
$db -> query("INSERT INTO tablename(certs) VALUES(4.123)");,问题出在query函数中,它在将SQL 发送到数据库之前将浮点数转换为整数,您需要阅读query函数文档以查找是否有任何参数/方法可以避免这种情况。 -
这是SafeMySQL source code。它并不是准备好的语句的真正包装器。其中没有绑定,字符串只是使用
mysqli_real_escape_string转义。我建议不要这样做,而是推荐prepared statements 或PDO。除非有另一个同名的包装器,但我还没有找到它。 -
@El_Vanja 哇,谢谢分享。是的,这就是我的程序员为我们的服务选择的 SafeMySQL。我不知道它是如此过时并且几乎没有多大用处。我刚刚切换到准备好的语句,现在一切正常。谢谢。