解析获取给出了无效的偏移量

时间:2018-08-27 17:54:21

标签: php mysql sql

不知道这是怎么回事,但是我的password_verify语句返回的是未定义的偏移量。在数据库密码中,必填字段是必填字段,不能为空,在尝试针对哈希验证密码之前,我已经验证了至少返回了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";
    }
?>

1 个答案:

答案 0 :(得分: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个字符的宽度。小于此值将导致测试失败。