Php 我的数据库密码和用户填写的密码不匹配
我的php登录文件有问题。我通过查看电子邮件向数据库询问密码。当我获得此密码时,我会将其与用户填写的密码进行核对 在Php 我的数据库密码和用户填写的密码不匹配,php,authentication,Php,Authentication,我的php登录文件有问题。我通过查看电子邮件向数据库询问密码。当我获得此密码时,我会将其与用户填写的密码进行核对 在密码\u验证($Passwd,$row['Passwd'])中,结果将始终返回0,但结果应返回1(密码匹配) 为什么我的密码彼此不匹配 登录代码: <?php if(isset($_POST['submit'])){ include_once '../includes/connection.php'; $Email = $_POST['email'];
密码\u验证($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)列。手册上说:
建议将结果存储在可扩展到60个字符以上的数据库列中(最好选择255个字符)
因此,您需要为数据库中的密码列指定至少60个字符的大小-但建议使用更大的大小,例如255,以防将来更改默认哈希算法
您还需要重新生成存储在50个字符字段中的任何现有密码,因为它们在保存时会被截断,并且额外的信息已丢失,这意味着这些旧密码永远无法验证。您显示的代码看起来正常。但是,由于我们无法查看您发送到服务器的电子邮件和密码,或者包含哈希密码的数据库行的外观,或者您最初是如何保存密码的,因此很难确切地确定可能出现了什么问题。当用户创建帐户时,密码通过
password\u hash
散列到数据库中。在我上面的代码中,$row['Passwd']返回哈希密码,如果我回显$Passwd,则返回用户在表单中填写的累计密码。所以$row['Passwd']是从数据库散列出来的,而$Passd是用户在表单OK中填写的内容。可能是第一次保存密码时出错了。你能给我看一下所有相关的代码吗?我在哪里可以发布我的其他代码?因为在stackoverflow上有一个时间限制。我把它写在下面作为一个答案-如果有帮助,请标记为“接受”和/或upvote。谢谢:-)