我正在尝试创建一个登录页面,该页面查询数据库以检查用户名和密码是否有效,并允许使用会话访问以下页面。目前,我只是使用XAMPP来测试登录。这是我在PHP页面中的以下代码。
<?php
include("config.php");
session_start();
// Check for POST method
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = stripslashes($_POST['username']);
$username = mysqli_real_escape_string($con, $username);
$password = stripslashes($_POST['password']);
$password = mysqli_real_escape_string($con, $password);
//Search database for username and password
$stmt = $con->prepare("SELECT * FROM users
WHERE username = ? LIMIT 1"); // Prepared statement
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_object();
if(password_verify($_POST['password'], $user->password)) {
echo("working");
$_SESSION['loggedin'] = true;
$_SESSION['user'] = $user->username;
header("Location: index.php");
} else {
echo("no user");
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Login</title>
</head>
<body>
<form id="loginForm" method="post" action="">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="submit" value="Login">
</form>
</body>
</html>
我添加了一个echo语句,只是为了查看它是否会为数据库中而不是数据库中的两个用户/密码集输出“ no user”。它们都显示“无用户”,所以我认为我没有正确搜索数据库。我对PHP有点陌生,并且使用了this code。
感谢评论,修复了密码,以便对它们进行哈希处理。
当它仍然不起作用时:
将数据库中的密码数据类型设置为VARCHAR(60),建议使用VARCHAR(255)
我意识到这是因为我将密码数据类型设置为VARCHAR(40)。由于我使用bycrypt进行哈希处理,因此它是60个字符串。我将密码设置为建议的VARCHAR(255),以防将来决定使用PASSWORD_DEFAULT。最初创建数据库和字段时,我没有意识到password_hash()
documentation中提到的所有内容。
已将session_start()
添加到引用$_SESSION[]
的所有页面
当我输入正确的信息时,回显var_dump()
以显示返回password_verify()
的{{1}}的结果,但是,页面stil一直将我重定向到登录名。在PHP中,我重定向到了这段代码:
true
我忘记将<?php
if($_SESSION['loggedin'] == false) {
header("Location: login.php");
} else {
}
?>
放在PHP页面中,因此它一直将我重定向到登录名。