【问题标题】:Trying to access array offset on value of type bool in [duplicate]尝试访问 [重复] 中 bool 类型值的数组偏移量
【发布时间】: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-&gt;fetch(PDO::FETCH_ASSOC); 失败并由于某种原因返回false。您应该始终检查结果,而不是仅仅假设一切正常。
  • 确实,您已经确认该查询没有返回任何记录,并且您正在尝试将布尔值(在这种情况下为 false)视为错误告诉您的数组。现在您需要弄清楚为什么没有与您的查询匹配的数据。或许可以从转储您尝试发送的电子邮件地址开始。
  • 这能回答你的问题吗? My PDO Statement doesn't work

标签: php authentication pdo


【解决方案1】:

每当您收到如下错误时,您都必须重新验证您的假设:

尝试访问 bool 类型值的数组偏移量

这个错误意味着你认为是数组的变量不是。在这种情况下,您假设 $records-&gt;fetch(PDO::FETCH_ASSOC) 返回了一个数组,但如果没有更多匹配行,则此方法将返回 return FALSE

通常,此类错误通过以下if 语句修复:

$results = $records->fetch(PDO::FETCH_ASSOC);
if($results && password_verify($_POST['password'], $results['password'])) {
    // ...
}

如果您确实希望 $results 包含值,那么您需要重新检查其余代码和数据。检查数据库中的数据和准备好的语句中提供的数据,以确保您的所有假设都是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2020-08-01
    • 2021-03-31
    • 2020-10-03
    • 2020-04-27
    相关资源
    最近更新 更多