我有一个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']
它只有一页,并且效果很好。
答案 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。”。