在另一个页面中重定向时php会话不工作


php session not working when redirecting in another page

会话在我的代码中不起作用。我有一个登录表单,当用户在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();
}
?>

感谢

使用main.php顶部的session_start();来解决问题。

您的代码在许多方面都是错误的。首先,它打破了SOLID的第一条规则。单一责任制。不能使用同一个类从数据库加载记录并登录给定的用户。您必须使用存储库来处理来自数据库的几乎所有内容,而现代php应用程序所做的就是使用ORM来处理您的模型和数据库。

第二个问题是您的查询。您正在通过检查给定用户名是否存在来测试来自请求的给定数据是否有效。这在很多方面都是错误的,我不想详述。要登录用户,您还应该匹配其密码,并且应该对该密码进行哈希处理。

但是,即使查询是正确的,您也要遍历来自数据库的每一条记录,同时将这些数据存储在更高范围的两个变量中,这样您就可以检查用户名匹配的最后一个用户的数据。

最后但同样重要的是,在包含的脚本中,您肯定不会调用session_start();

使您的代码PSR-04兼容,这样您就可以使用composer加载依赖项。

这是通过以下方式完成的,

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";
}