mysqli_stmt::fetch(); returns 是一个布尔值,但应该是 return 一个数组
mysqli_stmt::fetch(); returns a boolean value but is expected to return an array
我正在制作一个简单的登录功能,其中的代码确实有效(来自教程)。
它会导致错误通知:
Notice: Trying to access array offset on value of type bool in
为什么 $row = $query->fetch();
return 是布尔值而不是数组?
具有正确登录数据的 var_dump($query)
结果:
object(mysqli_stmt)#2 (10) {
["affected_rows"]=> int(-1)
["insert_id"]=> int(0)
["num_rows"]=> int(0)
["param_count"]=> int(1)
["field_count"]=> int(3)
["errno"]=> int(0)
["error"]=> string(0) ""
["error_list"]=> array(0) { }
["sqlstate"]=> string(5) "00000"
["id"]=> int(1)
}
var_dump($row)
的结果:bool(true)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['submit'])) {
$email = trim($_POST["email"]);
$password = trim($_POST["password"]);
if($query = $db->prepare("SELECT * FROM user WHERE email = ? ")) {
$query->bind_param("s",$email);
$query->execute();
var_dump($query);
$row = $query->fetch();
var_dump($row);
if($row) {
if(password_verify($password, $row['password'])) {
header("location:https://whosebug.com/");
exit;
}
}
}
}
mysqli_stmt::fetch()
方法没有 return 数组。它总是 return 是一个布尔值。
您要查找的是 mysqli_result
对象。您可以通过调用 get_result()
来获取该对象。这个对象有像 fetch_assoc()
这样的方法,它将 return 一个值数组。例如:
$query = $db->prepare("SELECT * FROM user WHERE email = ? ");
$query->bind_param("s", $email);
$query->execute();
$row = $query->get_result()->fetch_assoc();
if ($row && password_verify($password, $row['password'])) {
header("location:https://whosebug.com/");
exit;
}
但是,如果您希望 select 数据库中的单个字段,则可以使用 mysqli_stmt::fetch()
,但必须将 SQL 列绑定到 PHP 变量.
$query = $db->prepare("SELECT password FROM user WHERE email = ? ");
$query->bind_param("s", $email);
$query->execute();
$query->bind_result($hashedPassword);
if ($query->fetch() && password_verify($password, $hashedPassword)) {
header("location:https://whosebug.com/");
exit;
}
我正在制作一个简单的登录功能,其中的代码确实有效(来自教程)。 它会导致错误通知:
Notice: Trying to access array offset on value of type bool in
为什么 $row = $query->fetch();
return 是布尔值而不是数组?
具有正确登录数据的 var_dump($query)
结果:
object(mysqli_stmt)#2 (10) {
["affected_rows"]=> int(-1)
["insert_id"]=> int(0)
["num_rows"]=> int(0)
["param_count"]=> int(1)
["field_count"]=> int(3)
["errno"]=> int(0)
["error"]=> string(0) ""
["error_list"]=> array(0) { }
["sqlstate"]=> string(5) "00000"
["id"]=> int(1)
}
var_dump($row)
的结果:bool(true)
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['submit'])) {
$email = trim($_POST["email"]);
$password = trim($_POST["password"]);
if($query = $db->prepare("SELECT * FROM user WHERE email = ? ")) {
$query->bind_param("s",$email);
$query->execute();
var_dump($query);
$row = $query->fetch();
var_dump($row);
if($row) {
if(password_verify($password, $row['password'])) {
header("location:https://whosebug.com/");
exit;
}
}
}
}
mysqli_stmt::fetch()
方法没有 return 数组。它总是 return 是一个布尔值。
您要查找的是 mysqli_result
对象。您可以通过调用 get_result()
来获取该对象。这个对象有像 fetch_assoc()
这样的方法,它将 return 一个值数组。例如:
$query = $db->prepare("SELECT * FROM user WHERE email = ? ");
$query->bind_param("s", $email);
$query->execute();
$row = $query->get_result()->fetch_assoc();
if ($row && password_verify($password, $row['password'])) {
header("location:https://whosebug.com/");
exit;
}
但是,如果您希望 select 数据库中的单个字段,则可以使用 mysqli_stmt::fetch()
,但必须将 SQL 列绑定到 PHP 变量.
$query = $db->prepare("SELECT password FROM user WHERE email = ? ");
$query->bind_param("s", $email);
$query->execute();
$query->bind_result($hashedPassword);
if ($query->fetch() && password_verify($password, $hashedPassword)) {
header("location:https://whosebug.com/");
exit;
}