PHP/MySQL/PDO-登录表单无法识别现有用户

PHP/MySQL/PDO-登录表单无法识别现有用户,php,mysql,pdo,passwords,encryption,Php,Mysql,Pdo,Passwords,Encryption,我的登录表单无法识别现有用户。我存储在数据库中的密码是使用PHP的crypt()函数加密的。当用户注册时,他们的密码也被加密并插入数据库 正如您在下面的代码中所看到的,它会检查下面输入的密码是否匹配,但每当我输入一个存储在数据库中的密码并使用相应的用户名时,它就会说该用户不存在 我是PDO新手,这是我第一次使用它,通常如果我只使用MySQL,它就可以正常工作,但由于某些原因,它不能正常工作,我对代码做了一些更改,但它仍然不能正常工作。任何人都知道我为什么/在哪里/在代码上做错了什么 includ

我的登录表单无法识别现有用户。我存储在数据库中的密码是使用PHP的crypt()函数加密的。当用户注册时,他们的密码也被加密并插入数据库

正如您在下面的代码中所看到的,它会检查下面输入的密码是否匹配,但每当我输入一个存储在数据库中的密码并使用相应的用户名时,它就会说该用户不存在

我是PDO新手,这是我第一次使用它,通常如果我只使用MySQL,它就可以正常工作,但由于某些原因,它不能正常工作,我对代码做了一些更改,但它仍然不能正常工作。任何人都知道我为什么/在哪里/在代码上做错了什么

include "connect.php";

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

$sql = "SELECT * FROM users WHERE username=:username";
$statement = $db->prepare($sql);
$statement->bindValue(':username',$username,PDO::PARAM_STR);

if($statement->execute())
{
    if($statement->rowCount() == 1)
    {
        $row = $statement->fetch(PDO::FETCH_ASSOC);

        if(crypt($password, $row['username']) == $row['user_password'])
        {
            $username = $row['username'];
            $email = $row['email'];

            $_SESSION['username'] = $username;
            $_SESSION['email'] = $email;
            $_SESSION['logged_in'] = 1;

            header("Location: index.php");
            exit;
        }
        else
        {
            include "error_login.php";
        }
    }
    else
    {
        include "error_login.php";
    }
}
应该是

if(crypt($password) == $row['user_password'])

要使用存储的散列值验证密码,您需要知道salt以及之前用于生成散列值的算法。这个salt可以从存储的哈希值中提取,因为crypt()将其存储为结果字符串的一部分

if (crypt($password, $row['user_password']) === $row['user_password'])
PHP5.5将准备好自己的函数和密码_verify(),以简化BCrypt哈希的生成。我强烈建议使用这个优秀的api,或者它适用于早期的PHP版本。用法非常简单:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

您的两个if语句都包含
error\u login
if它们为false-您知道调用的是哪一个吗?请使用
session\u start()在顶部also@andrew:但只有在地下室不匹配的情况下才可以。@andythebrit:用鸟枪射击。在整个过程中添加一些debug
echo
语句,这样您就可以了解所采用的代码路径。很可能代码本身很好,但数据库中的密码不是PHP生成的密码,因此密码永远不会匹配。您需要在顶部使用
session\u start()
,否则将无法访问所有这些会话变量。另外,请注意,如果在同一个字符串上使用
crypt()
两次而不指定“salt”字符串,它将输出两个不同的结果,因为
crypt()
将自动生成salt。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);