会话已设置,但在第一次转到另一个页面后无法正常工作

Session is set, but not working after going to another page just at first time

我有一个 login.php 和一些用户区页面。登录后,它可以运行并转到 user.php,我使用一些 $_SESSION 变量来显示名称和用户名。它有效,我的 $_SESSION 变量也是第一次设置,它将保留在 user.php.

但是当我转到用户区的另一个页面时,它返回到 login.php,但是如果我再次登录,那么就没问题了,我可以毫无问题地转到不同的页面。为什么?

我试过这些东西:

我将 $_SESSION['log_in'] 从布尔值更改为字符串,或者使用另一个会话,如 $_SESSION['username'] 用于 !isset($_SESSION['username'])(每页顶部)。此用户名会话将显示在 user.php 但之后我转到另一个页面不起作用。

我在每个页面的顶部都有 session_start()

<?php
session_start();
if(!isset($_SESSION['log_in'])){
   header("Location: login.php");
}
// I have this code top of every page.
?>

这是login.php:

<?php
   session_start();
   if(isset($_SESSION['log_in'])){
   header("Location:user.php");
}
    if( password_verify($_POST['password'],$user['password'])) {
        $_SESSION['name'] = $user['name'];
        $_SESSION['email'] = $user['email'];
        $_SESSION['username'] = $user['username'];

        //to know is user login or not
        $_SESSION['log_in'] = TRUE;
        echo "<meta http-equiv=Refresh content=2;url=user.php>";
        //if I user header("Location: user.php") it doesn't go to user, but with meta it goes to user.php
?>

这是user.php:

<?php
session_start();
if(!isset($_SESSION['log_in'])){
   header("Location: login.php");
}
// this is top of my user.php and top of another pages too.
?>

这是注销:

<?php
session_start();
if(isset($_SESSION['log_in'])) {
    session_unset();
    session_destroy();
    header('location: login.php');
} else {
    session_unset();
    session_destroy();
    header('location: http://www.mywebsite.com');
}
// this is my logout.php
?>

我没有收到任何错误,我也有另一个会话部分供管理员使用,但我写了完全不同的会话,例如 $_SESSION['admin_log_in'] 它只有一页而且效果很好。

我刚发现问题 - 这是一个非常棘手的调试问题。

这是您的代码片段之一,多了一行代码 - exit:

<?php
session_start();
if(!isset($_SESSION['log_in'])){
   header("Location: login.php");
   exit();
}
// this is top of my user.php and top of another pages too.
?>

那么,这里发生了什么?

header() 调用 queues 一个 HTTP header 发送到浏览器 - 它可以立即发送,也可以发送一次 HTML 输入由您的程序发出(因为您没有明确刷新此信息,我们不知道它何时发送)。

需要注意的重要一点是,当您调用 header() 时,您的 PHP 脚本 会继续执行 。你没有告诉它停止。所以,它会做一堆你没想到的事情。

在某些时候,浏览器将收到 Location header,并终止连接,在大多数网络服务器配置中,PHP 将停止执行,因为您的网络服务器控制着 PHP 解释器。因此,在浏览器终止连接和脚本结束之间存在竞争条件;脚本中执行的内容可能会因一个 运行 而异。这将部分取决于网络延迟 - 较慢的网络连接将允许脚本在终止之前走得更远。

确保在 header 调用后立即停止脚本,或者至少有意且优雅地退出,将解决此问题。

(代题作者发表).

我应该打开我的网站 "www."。