【问题标题】:Parsing Fetch gives Invalid Offset解析 Fetch 给出无效的偏移量
【发布时间】:2018-08-27 17:54:21
【问题描述】:

不确定这里发生了什么,但我的 password_verify 语句返回了一个未定义的偏移量。在 DB 密码是必填字段中,它不能为空,并且在尝试根据哈希验证密码之前,我已经验证至少返回了 1 个匹配行。当我在此语句之前使用 foreach 循环并检查结果变量时,它给了我哈希密码就好了,所以我知道数组中至少有 1 个值。但是当我尝试访问 $result[0] 时,由于某种原因抛出了未定义的偏移量。尝试查找此内容,但除了错误之外找不到相关信息,只是说明数组索引无效,这又是不可能的,因为我可以使用 foreach 检查结果变量并查看其中的散列密码。

还有第二个问题,因为我仍在学习 PDO,当我从提取请求中删除 PDO::FETCH_ASSOC 时,我的结果变量中出现重复条目​​。这是为什么呢?

Login.php

<?php
    require "conn.php";

    $email = $_POST['email'];
    $email = strtolower($email);
    $pass = $_POST['password'];

    $stmt = $pdo->prepare("SELECT password FROM account WHERE email=:email");
    $stmt->bindParam(":email", $email);
    $stmt->execute();
    $count = $stmt->rowCount(); // gets count of records found

    if($count > 0) {
        $result = $stmt->fetch(PDO::FETCH_ASSOC); // gets resultset
        if(!password_verify($pass, $result[0])) {
            echo "2";
        } else
            echo "0";
    }
    else {
        echo "1";
    }
?>

【问题讨论】:

  • 您不必计算行数,只需测试结果即可。
  • 你正在做 PDO::FETCH_ASSOC 但随后按索引引用行 $result[0]
  • 你检索到一个关联数组,所以使用$result['password']
  • 没有 FETCH_ASSOC 重复的原因是 PDO 检索了一行并创建了一个具有 both 关联数组键 ['password'] 和数字数组索引 [0] 的数组( because its default is FETCH_BOTH) 并且会对SELECT 中的每一列都这样做。这样做的充分理由很少。最好只明确请求您需要的类型。
  • @JayBlanchard 嗯,不,我不认为我会被归类为错字。

标签: php mysql sql


【解决方案1】:

这将为您节省几毫秒的时间,但您应该先获取,然后在没有附加条件语句的情况下测试结果。由于您使用的是PDO::FETCH_ASSOC,因此您应该使用列名作为标识符,而不是索引:

<?php
    require "conn.php";

    $email = $_POST['email'];
    $email = strtolower($email);
    $pass = $_POST['password'];

    $stmt = $pdo->prepare("SELECT password FROM account WHERE email=:email");
    $stmt->bindParam(":email", $email);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC); // just fetch

    if(!password_verify($pass, $result['password'])) { // note, column name as identifier, if the password is bad or the column is empty the test is valid
            echo "2";
    } else {
            echo "0";
    }
?>

此外,password_hash() 需要一个至少 60 个字符宽的列。低于此值将导致测试失败。

【讨论】:

  • 非常感谢,您对 password_hash 的建议解决了另一个问题!我完全忘记了我今天早些时候重新创建了表格,当我这样做时,我将字段的长度设置为 20(这是用户输入的最大密码长度)并且完全忘记了你必须为哈希过程。我编辑了数据库并将字段从 20 设置为 75,现在它工作得很好,非常感谢。对不起,我很痛苦!
  • 你不痛!很高兴能够提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2016-09-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多