如何使用准备好的语句选择 IP 地址
Posted
技术标签:
【中文标题】如何使用准备好的语句选择 IP 地址【英文标题】:How to select ip address with prepared statement 【发布时间】:2019-08-03 11:05:37 【问题描述】:我正在尝试使用准备好的 php 语句选择 IP 地址,如果 IP 已经存在,则一切正常,但如果不存在,它永远不会进入 if($stmt -> num_rows === 0)
,它总是进入 else
like if查询错误。该字段设置为int unsigned
。
那么这个prepared statement?
有什么问题,当select
不匹配任何东西时,如何让它进入if($stmt -> num_rows === 0)
?
$ip_long= ip2long($ip);
$stmt = $mysqli -> prepare('SELECT INET_NTOA(ip), registry_date FROM users WHERE ip = ?');
if (
$stmt &&
$stmt -> bind_param('i', $ip_long) &&
$stmt -> execute() &&
$stmt -> store_result() &&
$stmt -> bind_result($ip, $registry_date_checker) &&
$stmt -> fetch()
)
if($stmt -> num_rows === 0)
//It does never enter here.
if($stmt -> num_rows === 1)
//If exist enter here.
else
//If select not found anything it always enter here.
echo "Error mysqli: ".$mysqli-> error; //Returns empty error
echo "Error stmt : ".$stmt -> error; //Returns empty error
echo "Numrows: ".$stmt -> num_rows; //Returns 0
exit;
【问题讨论】:
也许你应该检查实际的错误信息,然后你就不会出错了。 我更新了我的问题。 stmt 和 mysqli 的错误是空的,所以我想它们没有错。 【参考方案1】:如果结果集中不存在任何行,mysqli_stmt::fetch 方法将返回 null
。在布尔上下文中,null
被解释为false
。
这意味着如果您的查询没有返回任何记录,那么您的第一个 if
将直接进入 else
分支。
我会将$stmt -> fetch()
替换为
($stmt -> fetch() ?: true)
在你的第一个如果。这会将null
值转换为true
。
【讨论】:
【参考方案2】:你的代码写错了
这里是
if($stmt->num_rows() === 0)
//It does never enter here.
elseif($stmt->num_rows() === 1)
//If exist enter here.
新版本的 mysqli 使用 num_rows 作为函数而非键对象。
【讨论】:
以上是关于如何使用准备好的语句选择 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章
包含 IP 地址的 SQL 查询作为普通查询工作,但不是作为准备好的语句