使用 password_verify() 登录系统
Login system with password_verify()
我正在尝试使用散列密码制作登录系统。
应该发生的是在我单击提交按钮后应该创建一个会话并且我应该被重定向到 home.php。如果输入数据与数据库中的数据不匹配,我应该收到 "Error 1" 或 "Error 2" 警报。
我的问题是,当我点击提交按钮时,所有发生的事情都是我被重定向到 login.php。我没有收到任何错误和警报,只有 login.php URL.
的空白屏幕
我正在想办法让 password_verify() 部分起作用。感谢任何形式的帮助。
数据库图片:https://imgur.com/a/BXiHBN4
尝试登录后发生的情况图片:https://imgur.com/a/qKZ1tsi
表单代码:
<html>
<head>
<title> Login now! </title>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>
<header>
<div class="alignRight">
<a href="registration.html"> Register </a>
</div>
<div class="alignLeft">
<a href="contact.html"> Contact us </a>
<a href="aboutus.html"> About us </a>
<a href="news.html"> News </a>
</div>
</header>
<h1> Welcome back! </h1>
<h2> Log in to continue with your work. </h2>
<form name="login-form" id="login-form" action="login.php" method="post">
<input class="_40" type="text" name="username" pattern="[a-zA-Z0-9_]{1,15}"
placeholder="Username" required />
<br />
<input class="_40" type="password" name="pwd" placeholder="Password" required />
<br />
<input id="loginSubmitButton" type="submit" value="Submit" />
</form>
</body>
</html>
PHP代码:
<?php
session_start();
$servername ="localhost";
$username = "root";
$password = "";
$link = mysqli_connect($servername, $username, $password);
mysqli_select_db($link, "users");
$username = mysqli_real_escape_string($link, $_POST["username"]);
$pwd = mysqli_real_escape_string($link, $_POST["pwd"]);
$query = "SELECT * FROM users WHERE Username = '$username'";
$result = mysqli_query($link, $query);
$row = mysqli_fetch_assoc($result);
if(($result->num_rows > 0))
{
while($row = mysqli_fetch_array($result))
{
if(password_verify($pwd, $row["Hash"]))
{
$_SESSION["username"] = $username;
header("location:home.php");
}
else
{
echo '<script>alert("Error 1")</script>';
}
}
}
else
{
echo '<script>alert("Error2")</script>';
}
?>
我想我明白问题了。
看起来您可能正在从结果中获取 if
之前的唯一行
$row = mysqli_fetch_assoc($result);
那么当你在这里再次获取时,就没有任何东西可以获取了。
if(($result->num_rows > 0))
{
while($row = mysqli_fetch_array($result))
(我假设查询只会 return 一行,因为用户名是唯一的。)
我正在尝试使用散列密码制作登录系统。
应该发生的是在我单击提交按钮后应该创建一个会话并且我应该被重定向到 home.php。如果输入数据与数据库中的数据不匹配,我应该收到 "Error 1" 或 "Error 2" 警报。
我的问题是,当我点击提交按钮时,所有发生的事情都是我被重定向到 login.php。我没有收到任何错误和警报,只有 login.php URL.
我正在想办法让 password_verify() 部分起作用。感谢任何形式的帮助。
数据库图片:https://imgur.com/a/BXiHBN4
尝试登录后发生的情况图片:https://imgur.com/a/qKZ1tsi
表单代码:
<html>
<head>
<title> Login now! </title>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>
<header>
<div class="alignRight">
<a href="registration.html"> Register </a>
</div>
<div class="alignLeft">
<a href="contact.html"> Contact us </a>
<a href="aboutus.html"> About us </a>
<a href="news.html"> News </a>
</div>
</header>
<h1> Welcome back! </h1>
<h2> Log in to continue with your work. </h2>
<form name="login-form" id="login-form" action="login.php" method="post">
<input class="_40" type="text" name="username" pattern="[a-zA-Z0-9_]{1,15}"
placeholder="Username" required />
<br />
<input class="_40" type="password" name="pwd" placeholder="Password" required />
<br />
<input id="loginSubmitButton" type="submit" value="Submit" />
</form>
</body>
</html>
PHP代码:
<?php
session_start();
$servername ="localhost";
$username = "root";
$password = "";
$link = mysqli_connect($servername, $username, $password);
mysqli_select_db($link, "users");
$username = mysqli_real_escape_string($link, $_POST["username"]);
$pwd = mysqli_real_escape_string($link, $_POST["pwd"]);
$query = "SELECT * FROM users WHERE Username = '$username'";
$result = mysqli_query($link, $query);
$row = mysqli_fetch_assoc($result);
if(($result->num_rows > 0))
{
while($row = mysqli_fetch_array($result))
{
if(password_verify($pwd, $row["Hash"]))
{
$_SESSION["username"] = $username;
header("location:home.php");
}
else
{
echo '<script>alert("Error 1")</script>';
}
}
}
else
{
echo '<script>alert("Error2")</script>';
}
?>
我想我明白问题了。
看起来您可能正在从结果中获取 if
之前的唯一行$row = mysqli_fetch_assoc($result);
那么当你在这里再次获取时,就没有任何东西可以获取了。
if(($result->num_rows > 0))
{
while($row = mysqli_fetch_array($result))
(我假设查询只会 return 一行,因为用户名是唯一的。)