包含 IP 地址的 SQL 查询作为普通查询工作,但不是作为准备好的语句
Posted
技术标签:
【中文标题】包含 IP 地址的 SQL 查询作为普通查询工作,但不是作为准备好的语句【英文标题】:SQL query containing IP address works as normal query but not as prepared statement 【发布时间】:2019-08-04 22:04:43 【问题描述】:有效的代码见底部
我有一个页面可以检查用户最后一次按下用户当前 IP 地址中的按钮的时间。代码如下所示:
$lastPressQuery = "SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = $ipNum";
$lastPressResult = mysqli_query($conn, $lastPressQuery);
$lastPressRow = mysqli_fetch_assoc($lastPressResult);
($ipNum
使用 ip2long 转换)
此代码按预期工作。但是,根据最佳实践,我想将其更改为准备好的声明。这是我为准备好的语句编写的代码:
$lastPressQuery = $conn -> prepare("SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = ?");
$lastPressQuery -> bind_param("i", $ipNum);
$lastPressResult = $lastPressQuery -> execute();
$lastPressRow = mysqli_fetch_assoc($lastPressResult);
这不起作用。 execute()
返回 false。
我尝试将 IP 地址保留为字符串,将$ip
保留为字符串并在其周围放置撇号或问号,检查 ipNum
是否有错误,然后将它应该直接创建的查询输入 SQL(其中作品)。稍后准备好的INSERT
数据声明工作正常。是什么导致这个准备好的语句失败?
编辑:我终于让它工作了。成功的代码是:
$lastPressQuery = $conn -> prepare("SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = ?");
$lastPressQuery -> bind_param("i", $ipNum);
$lastPressQuery -> execute();
$lastPressResult = $lastPressQuery -> get_result();
【问题讨论】:
你知道 IP != 人。一个人可以使用多个 IP,一个 IP 可以是数千个不同的人。 我知道,但在我所拥有的一切正常之前,我并不关心如何有效地区分人。 确保mysqli raises exceptions。什么是gettype($ipNum)
?
$ipNum
是一个整数
$ipNum
到底是什么?你能举个例子吗?为什么是整数?
【参考方案1】:
你传递的是准备好的语句对象,而不是结果,试试
$lastPressResult = $lastPressResult -> execute();
$lastPressRow = mysqli_fetch_assoc($lastPressResult);
【讨论】:
感谢您通知我。我已经更新了我的代码以匹配,但execute()
在我运行它时仍然返回 false。
请粘贴您的 CREATE TABLE 语句,可能该字段不够宽或未签名。
我不确定“字段不够宽或未签名”是什么意思,但我知道相同的查询适用于 mysqli_query() 并且没有准备。编辑:我之前认为执行返回 false,echo $lastPressResult;
返回 true(或者更确切地说,1)。【参考方案2】:
成功的代码是:
$lastPressQuery = $conn -> prepare("SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = ?");
$lastPressQuery -> bind_param("i", $ipNum);
$lastPressQuery -> execute();
$lastPressResult = $lastPressQuery -> get_result();
【讨论】:
以上是关于包含 IP 地址的 SQL 查询作为普通查询工作,但不是作为准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章