会话在我的代码中不起作用。我有一个登录表单,当用户在db上时,该页面会将他重定向到main.php,但它无法正常工作
//index.php
<?php
session_start();
include('connect.php');
if(isset($_POST['submit'])){
$username = mysqli_real_escape_string($dbCon, $_POST['username']);
$password = mysqli_real_escape_string($dbCon, $_POST['password']);
$sql = "select username, password from users where username='$username'";
$res = mysqli_query($dbCon, $sql);
if(!$res){
die(mysqli_errno);
}
while ($row = mysqli_fetch_assoc($res)){
$usr = $row['username'];
$pass = $row['password'];
}
if($username == $usr && $password == $pass){
$_SESSION["username"] = $username;
header("Location: main.php");
exit();
} else {
$error = "Invalid username or password";
}
}
?>
这是我的main.php
//main.php
<?php
if(isset($_SESSION["username"])) {
$username = $_SESSION["username"];
} else {
header('Location: index.php');
die();
}
?>
感谢
答案 0 :(得分:0)
您的代码在很多方面都是错误的。首先,它打破了SOLID的第一条规则。单一责任一。您不能使用同一个类从数据库加载记录并登录给定用户。你必须使用存储库来处理几乎所有来自数据库的东西,现代php应用程序所做的是它们使用ORM来处理你的模型和数据库。
第二个问题是您的查询。您正在通过检查给定的用户名是否存在来测试给定数据是否有效来自请求。这在许多方面都是错误的,我没有详细介绍。要登录用户,您也应该匹配它的密码,并且应该对该密码进行哈希处理。
但即使查询是正确的,您也会循环遍历来自数据库的每条记录,同时将这些数据存储在更高范围的2个变量中,这样您就可以检查来自用户匹配的最后一个用户的数据。
最后但并非最不重要的是,您并未在所包含的脚本中确认session_start();
。
使您的代码与PSR-04兼容,以便您可以使用composer加载依赖项。
答案 1 :(得分:0)
使用session_start();
顶部的main.php
来解决您的问题。
答案 2 :(得分:0)
这是通过以下方式完成的,
1.在session_start()
之后设置会话值2.使用标题功能重定向
if($username == $usr && $password == $pass){
session_start();
$_SESSION["username"] = $username;
header('location: main.php');
exit();
} else {
$error = "Invalid username or password";
}