【发布时间】:2020-11-01 00:18:52
【问题描述】:
我在 php 中有一个登录和注册表单。 我用这个用户注册创建了一些用户:
<?php
require 'database.php';
$message = '';
if (!empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['username'])) {
$sql = "INSERT INTO users (email, password, username) VALUES (:email, :password, :username)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':email', $_POST['email']);
$stmt->bindParam(':username', $_POST['username']);
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$stmt->bindParam(':password', $password);
if ($stmt->execute()) {
$message = 'El usuario ha sido creado';
header("Location: login.php");
} else {
$message = 'Debes rellenar los tres campos';
}
}
?>
我创建了一个用户并且密码匹配,但是当我登录时它告诉我这个错误:
尝试访问第 18 行 C:\xampp\htdocs\lapapaya\login.php 中 bool 类型值的数组偏移量 这是我 login.php 中的第 18 行
if (count($results) > 0 && password_verify($_POST['password'], $results['password']))
这是完整的代码:
<?php
session_start();
if (isset($_SESSION['user_id'])) {
header('Location: lapapaya'.$user_id);
}
require 'database.php';
if (!empty($_POST['email']) && !empty($_POST['password'])) {
$records = $conn->prepare('SELECT id, email, password FROM users WHERE email = :email');
$records->bindParam(':email', $_POST['email']);
$records->execute();
$results = $records->fetch(PDO::FETCH_ASSOC);
$message = '';
if (count($results) > 0 && password_verify($_POST['password'], $results['password'])) {
$_SESSION['user_id'] = $results['id'];
header("Location: /");
} else {
$message = 'Lo sentimos las claves no coinciden.';
}
}
?>
你们中的任何人都可以看到错误吗?
【问题讨论】:
-
猜测,
fetch正在返回false,表明该查询没有结果。在fetch之后尝试var_dump($results)进行确认。 -
嗯不工作,同样。 bool(false) 警告:count():参数必须是在 C:\xampp\htdocs\lapapaya\login.php 第 18 行中实现 Countable 的数组或对象 注意:尝试访问 bool 类型值的数组偏移量C:\xampp\htdocs\lapapaya\login.php 在第 18 行。我可以使用其他导航器登录,其中我将密码保存为记录。
-
那不是修复,它是为了调试你的代码。但它确实证实了@Jonnix 的建议,你的电话:
$records->fetch(PDO::FETCH_ASSOC);失败并由于某种原因返回false。您应该始终检查结果,而不是仅仅假设一切正常。 -
确实,您已经确认该查询没有返回任何记录,并且您正在尝试将布尔值(在这种情况下为 false)视为错误告诉您的数组。现在您需要弄清楚为什么没有与您的查询匹配的数据。或许可以从转储您尝试发送的电子邮件地址开始。
-
这能回答你的问题吗? My PDO Statement doesn't work
标签: php authentication pdo