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

时间:2019-06-01 19:15:06

标签: php php-7.2

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

但是当我转到userarea的另一个页面时,它使我返回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']它只有一页,并且效果很好。

2 个答案:

答案 0 :(得分:0)

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

这是您的代码段之一,其中包含一行额外的代码-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()调用将HTTP标头排队发送给浏览器-它可以立即发送,也可以在程序发出HTML输入后立即发送(因为您没有显式刷新此信息,我们不知道确切的发送时间。

要注意的重要一点是,当您调用header()时,您的PHP脚本会继续执行。您尚未告诉它停止。因此,它将完成很多您没想到的事情。

在某个时候,浏览器将收到Location标头,并将终止连接,并且在大多数Web服务器配置中,PHP将停止执行,因为您的Web服务器由PHP解释器控制。因此,在浏览器终止连接和脚本结束之间有一个 race condition 。在脚本中执行的内容甚至可能在一次运行之间有所不同。

确保您在标题调用后立即停止脚本,或者至少有意识地正常退出,将解决此问题。

答案 1 :(得分:0)

(代表问题作者发布)

我应该打开我的网站“ www。”。