包含 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 查询作为普通查询工作,但不是作为准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句查询IP段

mssql查询命令

PHP 根据IP获取地区查询数据库内容

Sybase,将字符串作为sql查询执行

域名查询IP及公网IP地址地理位置查询

SQL分布查询