我创建了一个辅助函数,我在我的代码中使用了很多,得到以下错误:
但我不明白的是我有zend服务器和我的代码在本地主机上运行良好。
警告:mysqli_ num_rows()期望参数1是mysqli_result, boolean在第26行
这是第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;
}
}
看这里的语句,
$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本地驱动程序(mysqlnd),所以如果你没有特定的驱动程序安装,它将无法工作。
同样,从你的问题中:
但我不明白的是我有zend服务器和我的代码在本地主机上运行良好。
这是因为您的本地服务器可能关闭了错误报告。在PHP脚本的最顶部添加这些行,以打开错误报告ini_set('display_errors', 1); error_reporting(E_ALL);
。另外,使用mysqli::$error.