请参阅底部的代码
我有一个页面,可以检查用户上一次从用户当前IP地址按下按钮的页面。代码看起来像这样:
$lastPressQuery = "SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = $ipNum";
$lastPressResult = mysqli_query($conn, $lastPressQuery);
$lastPressRow = mysqli_fetch_assoc($lastPressResult);
(使用IP2LONG转换$ipNum
(
此代码按预期工作。但是,根据最佳实践,我想将其更改为准备好的声明。这是我为准备好的语句编写的代码:
$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();
您正在传递准备好的语句对象,而不是结果,请尝试
$lastPressResult = $lastPressResult -> execute();
$lastPressRow = mysqli_fetch_assoc($lastPressResult);
成功的代码是:
$lastPressQuery = $conn -> prepare("SELECT MAX(tstamp) AS 'last_press' FROM presses WHERE ip = ?");
$lastPressQuery -> bind_param("i", $ipNum);
$lastPressQuery -> execute();
$lastPressResult = $lastPressQuery -> get_result();