我创建了一个帮助函数,我在整个代码中使用了很多这个错误。
但我不明白的是我有zend服务器,我的代码在本地主机上正常运行。为什么对现场服务器感到悲痛。
警告:mysqli_ num_rows()要求参数1为mysqli_result,第26行为boolean
这是第26行
function row_count($result){
global $connection;
return mysqli_num_rows($result);
}
登录代码
function login_user($email, $password){
$active = 1;
$connection = dbconnect();
$stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
$stmt->bind_param('ss', $email, $active);
$stmt->execute();
$result = $stmt->fetch();
if (row_count($result) == 1) {
$row = fetch_array($result);
$db_password = $row['user_pwd'];
if (password_verify($password, $db_password)) {
$_SESSION['email'] = $email;
$_SESSION['user_id'] = $row['user_id'];
$_SESSION['username'] = $row['username'];
return true;
} else {
return false;
}
return true;
} else {
return false;
}
}
答案 0 :(得分:2)
请看这里的陈述,
$result = $stmt->fetch();
来自mysqli_stmt::fetch的文档,
Return Values Value Description TRUE Success. Data has been fetched FALSE Error occurred NULL No more rows/data exists or data truncation occurred
首先,->fetch()
在成功时不会返回任何结果集。其次,这个方法用于将准备好的语句中的结果提取到绑定变量中,而这些变量是你不会做的。
解决方案是,首先使用->store_result()
后跟->num_rows
来获取SELECT
查询返回的总行数。然后将准备好的语句中的结果提取到绑定变量中,以便稍后可以在代码中使用这些绑定变量。所以你的代码应该是这样的:
function login_user($email, $password){
$active = 1;
$connection = dbconnect();
$stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
$stmt->bind_param('ss', $email, $active);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 1) {
$stmt->bind_result($db_password, $user_id, $username);
$stmt->fetch();
if (password_verify($password, $db_password)) {
$_SESSION['email'] = $email;
$_SESSION['user_id'] = $user_id;
$_SESSION['username'] = $username;
return true;
} else {
return false;
}
return true;
} else {
return false;
}
}
或者,您还可以使用->get_result()
方法来获得所需的结果。你的代码应该是这样的:
function login_user($email, $password){
$active = 1;
$connection = dbconnect();
$stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?');
$stmt->bind_param('ss', $email, $active);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows == 1) {
$row = $result->fetch_array();
$db_password = $row['user_pwd'];
if (password_verify($password, $db_password)) {
$_SESSION['email'] = $email;
$_SESSION['user_id'] = $row['user_id'];
$_SESSION['username'] = $row['username'];
return true;
} else {
return false;
}
return true;
} else {
return false;
}
}
注意: ->get_result()
方法仅适用于MySQL Native驱动程序(mysqlnd),因此如果您没有那就不能使用 / em>安装了特定的驱动程序。
另外,从你的问题:
但我不明白的是我有zend服务器,我的代码在本地主机上正常运行。为什么对现场服务器感到悲伤。
这是因为您的本地服务器上的错误报告可能已关闭。在PHP脚本的最顶部添加这些行以打开错误报告ini_set('display_errors', 1); error_reporting(E_ALL);
。另外,请使用mysqli::$error。