【发布时间】:2020-10-26 13:32:21
【问题描述】:
我的 php 登录文件有问题。我通过检查电子邮件从我的数据库中询问密码。当我得到这个密码时,我会用用户填写的密码来检查它。
在password_verify($Passwd, $row['Passwd']) 中,结果将始终返回 0,但结果应返回 1(密码匹配)。
为什么我的密码不匹配?
登录代码:
<?php
if(isset($_POST['submit'])){
include_once '../includes/connection.php';
$Email = $_POST['email'];
$Passwd = $_POST['passwd'];
//Create Template
$sql = "SELECT Passwd FROM user WHERE Email = ?";
//Create Prepared Statement
$stmt = mysqli_stmt_init($conn);
//Prepare Prepared Statement
if(!mysqli_stmt_prepare($stmt, $sql)){
echo "SQL Statement Failed";
} else {
mysqli_stmt_bind_param($stmt, "s", $Email);
mysqli_stmt_execute($stmt);
$res = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($res)){
echo $Passwd . "<br>";
echo $row['Passwd'];
if(password_verify($Passwd, $row['Passwd'])){
echo "1";
} else {
echo "0";
}
}
}
} else {
header("Location: ../index.php?login=error");
}
?>
注册码:
<?php
if(isset($_POST['submit'])){
include_once '../includes/connection.php';
$Username = $_POST['username'];
$Email = $_POST['email'];
$Passwd = $_POST['pwd'];
//Create Template
$sql = "INSERT INTO user (Username, Email, Passwd)
VALUES (?, ?, ?);";
//Create Prepared Statement
$stmt = mysqli_stmt_init($conn);
//Prepare Prepared Statement
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL Statement Failed";
} else {
$hashed_passwd = password_hash($Passwd, PASSWORD_DEFAULT);
//Replace '?' by the acctual data
mysqli_stmt_bind_param($stmt, "sss", $Username, $Email, $hashed_passwd);
//Run parameters inside database
mysqli_stmt_execute($stmt);
}
header("Location: ../index.php?signup=succes");
} else {
header("Location: ./index.php?sinup=error");
}
?>
Passwd 是数据库中的一个 varchar(50) 列。
【问题讨论】:
-
您显示的代码看起来没问题。但是,由于我们看不到您发送到服务器的电子邮件和密码,或者包含散列密码的数据库行是什么样的,或者您最初是如何保存密码的,因此很难确切地确定可能会发生什么错了。
-
当用户创建一个账户时,密码被散列到数据库中
password_hash。在我上面的代码中 $row['Passwd'] 如果我回显它,则返回散列密码,如果我回显 $Passwd 它返回用户在表单中填写的实际密码。所以 $row['Passwd'] 是从数据库中散列出来的,而 $Passd 是用户在表单中填写的内容 -
好的。首次保存密码时可能出现问题。你能展示所有相关的代码吗?
-
我在哪里可以发布我的其他代码?因为在stackoverflow上有时间限制
-
太棒了。我在下面写了它作为答案 - 如果有帮助,请标记为“已接受”和/或投票。谢谢:-)
标签: php authentication