在我的登录php页面中,在检查用户的信息是否保存在数据库中之后,我设置了一个会话:
$_SESSION['username'] = $user;
if (isset($_SESSION['username'])) {
header( 'Location: index.php' );
}
并将session_start();
放在此页面的顶部。
然后它将我重定向到index.php
,告诉我会话已经设置。在这个页面上,我将session_start();
放在顶部,但在登录区域,我输入:
<?php if (!isset($_SESSION['username'])) { echo $_SESSION['username'];?><a href="/login.php"><li class="cat_0" id="login_btn_1">Login / SignUp</li></a>
<?php }
else {?>
<span id="login_show"><a href="/account/user.php?u=<?php echo $_SESSION['username'];?>" id="username_btn"><?php echo $_SESSION['username']; ?><a href="/account/logout.php?logout=1" id="logout_btn">LOGOUT</a></a></span>
<?php }?>
但每次,即使我重新加载,它也会显示!isset()
的结果,因此告诉我们未设置会话变量。我检查了我的chrome cookies设置,它显示每次测试Login时都设置了PHPSESSID
。任何人都可以解释为什么我的会话没有开始或问题是什么?
答案 0 :(得分:0)
这可能是由于您的脚本与会话处理之间存在简单的竞争条件。
$_SESSION
是一个具有特定工作方式的超全球化。
您实际上是在尝试访问仍然只存在于会话处理程序缓冲区中的超全局变量。如果要访问会话变量,则需要先通过调用session_write_close()将缓冲的数据写入会话:
$_SESSION['username'] = $user;
session_write_close(); // remember, you can no longer write to the sessions any more
if (isset($_SESSION['username'])) {
header( 'Location: index.php' );
exit; // just for safety
}
答案 1 :(得分:0)
On the login page
-----------------
session_start();
if( !isset( $_SESSION['usename'] ) && isset( $user ) ) $_SESSION['username'] = $user;
if( isset( $_SESSION['username'] ) ) header( 'Location: index.php' );
On the index page
-----------------
if ( isset( $_SESSION['username'] ) ) {
echo '<span id="login_show">
<a href="/account/user.php?u='.$_SESSION['username'].'" id="username_btn">'.$_SESSION['username'].'</a>
<a href="/account/logout.php?logout=1" id="logout_btn">LOGOUT</a>
</span>';
} else {
echo "
<a href='/login.php'>
<li class='cat_0' id='login_btn_1'>Login / SignUp</li>
</a>";
}
html中有一个错误 - 有两个关闭标签,而且经常形成错误的html可以对页面的显示做各种奇怪的事情。