如何使用准备好的语句 select ip 地址
How to select ip address with prepared statement
我正在尝试 select 使用带有 php 的准备语句来获取 IP 地址,如果 IP 已经存在,则一切正常,但如果不存在,则永远不会进入 if($stmt -> num_rows === 0)
], 如果查询错误,它总是在 else
like 上输入。该字段设置为 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;
}
您在代码中输入错误
就是这里
if($stmt->num_rows() === 0) {
//It does never enter here.
}
elseif($stmt->num_rows() === 1) {
//If exist enter here.
}
新版本的 mysqli 使用 num_rows 作为函数而不是关键对象。
mysqli_stmt::fetch 方法 returns null
如果结果集中不存在任何行。在布尔上下文中 null
被解释为 false
.
这意味着如果您的查询没有返回任何记录,那么您的第一个 if
将直接进入 else
分支。
我会用
替换$stmt -> fetch()
($stmt -> fetch() ?: true)
在你的第一个如果。这会将 null
值转换为 true
.
我正在尝试 select 使用带有 php 的准备语句来获取 IP 地址,如果 IP 已经存在,则一切正常,但如果不存在,则永远不会进入 if($stmt -> num_rows === 0)
], 如果查询错误,它总是在 else
like 上输入。该字段设置为 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;
}
您在代码中输入错误
就是这里
if($stmt->num_rows() === 0) {
//It does never enter here.
}
elseif($stmt->num_rows() === 1) {
//If exist enter here.
}
新版本的 mysqli 使用 num_rows 作为函数而不是关键对象。
mysqli_stmt::fetch 方法 returns null
如果结果集中不存在任何行。在布尔上下文中 null
被解释为 false
.
这意味着如果您的查询没有返回任何记录,那么您的第一个 if
将直接进入 else
分支。
我会用
替换$stmt -> fetch()
($stmt -> fetch() ?: true)
在你的第一个如果。这会将 null
值转换为 true
.