PHP PDO MySQL password_verify问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP PDO MySQL password_verify问题相关的知识,希望对你有一定的参考价值。

我正在重建登录页面。

我有原始的没有password_verify代码工作正常。

没有password_verify代码的原始代码:

$username = $_POST['username'];
$password = md5($_POST['password']);

if($username != "" && $password != "") {

    try {
        $query = "SELECT * FROM `admin` WHERE `u_name`=:username and `u_pass`=:pass";
        $stmt = $db->prepare($query);
        $stmt->bindParam('username', $username, PDO::PARAM_STR);
        $stmt->bindValue('pass', $password, PDO::PARAM_STR);
        $stmt->execute();
        $count = $stmt->rowCount();
        $row   = $stmt->fetch(PDO::FETCH_ASSOC);
        if($count == 1 && !empty($row)) {
            $_SESSION['sess_user_id']   = $row['aID'];
            $_SESSION['sess_username'] = $row['u_name'];
            echo "home.php";
        } else {
            echo "invalid";
        }
    } catch (PDOException $e) {
        echo "Error : ".$e->getMessage();
    }


} else {
    echo "Both fields are required!";
}

但我编辑并在下面添加了password_verify代码到原始代码,它将无法正常工作。

$username = $_POST['username'];
$password = $_POST["password"];

if($username != "" && $password != "") {

    try {
    $stmt = $db->prepare("SELECT * FROM admin WHERE u_name = :uname" );
    $stmt->execute(array(':uname' => $_POST['username']));
    $row = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if(count($row)>0) {
            if (password_verify($password, $row['u_pass'])) {
                $_SESSION['sess_user_id']   = $row['aID'];
                $_SESSION['sess_username'] = $row['u_name'];
                echo "home.php";
            } else {
            echo "invalid";
            }
        } catch (PDOException $e) {
            echo "Error : ".$e->getMessage();
        }

    } else {
    echo "Both fields are required!";
    }
}

我仍然是PDO密码的初学者_非常我无法理解......

你能告诉我什么是错的/在哪里修理它?

我感谢你的帮助。

感谢您的时间。

答案

fetchAll()返回一个二维数组。由于表中只有一行供用户使用,因此只需使用fetch(),就像在原始代码中一样。

$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row && password_verify($password, $row['u_pass'])) {
    $_SESSION['sess_user_id']   = $row['aID'];
    $_SESSION['sess_username'] = $row['u_name'];
    echo "home.php";
} else {
    echo "invalid";
}
另一答案

问题是,当您使用$row在新版本中获取fetchAll()时,它是一个记录数组,您之后的行是结果中的第一个记录。所以你需要检查结果的第一行......

if(count($row)>0) {
    if (password_verify($password, $row[0]['u_pass'])) {
        $_SESSION['sess_user_id']   = $row[0]['aID'];
        $_SESSION['sess_username'] = $row[0]['u_name'];
        echo "home.php";
    } else {
    echo "invalid";
    }

在之前的版本中,您使用的是fetch(),这是主要区别。

以上是关于PHP PDO MySQL password_verify问题的主要内容,如果未能解决你的问题,请参考以下文章

php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例

centos 6.5下编译安装php5.6,不支持pdo_mysql问题。

PHP入门(15)使用PDO操作MySQL数据库

PDO PDO_MYSQL MYSQLI MYSQL 的区别

如何在PHP下开启PDO MySQL的扩展

php中的Mysqlnd、PDO和PDO_Mysql扩展有啥区别?