2012-10-24 51 views
1

我正在编写一个应该结束用户会话的脚本,并将它们从系统中注销,然后将它们返回到登录页面。结束会话,重置变量不起作用?

我注销脚本是这样的:

<?php 

$_SESSION['signin'] = null; 

session_destroy(); 

header("Location: /test/index.php"); 

?> 

起初我重置signin变量,即使这样的会议不被破坏的变量至少应该有改变,使系统认为用户登录出。

并且在我的登录页面的顶部,如果它们已经登录,我有一个条件可以将它们转发到主页,这种方式一旦登录就无法访问登录页面。这部分看起来像此:

<?php 
session_start(); 
if($_SESSION['signin'] == 5) 
{ 
     header("Location: /test/home.php"); 
} 
?> 

因此,在短期,当有人登录,并点击链接以注销它利用第一码块注销,然后被转发到包含代码的第二块,旋转的页面。

但是,此页面仍将我转回主页,认为用户仍然登录,因此我猜测signin变量未被重置。

关于如何解决我的问题的想法?

+0

我想,这个问题是你没有写出exit,在header()之后;使用类似'var_dump'的方式检查会话的值; – pomaxa

回答

0

session_destroy()不会取消设置会话中的任何全局变量。只需用:

session_unset(); 

到没有设置所有的全局变量,或者仅取消设置指定的变量,使用:

unset($_SESSION['signin']); 
+1

注意:从PHP手册:“只使用'session_unset()'为旧的不使用'$ _SESSION'的弃用代码”! ! – nickhar

+1

绝对好找。关于您的答案,PHP手册还建议应始终避免使用unset($ _ SESSION),并且您还在自己的代码中使用(出于某种原因)前面已弃用的$ HTTP_SESSION_VARS。 –

+1

+1呵呵。 Touche将很快从代码库中删除并提交(双赢);) – nickhar

0

你可以尝试这样的事情。

session_unset() 
0

你没有使用session_destroy();应该足够

,我不知道究竟PHP的深层的东西用

$_SESSION['signin'] = null; 

,但如果你设置了$ _SESSION变量为NULL,PHP可以读取它,因为它被设置为NULL,这意味着“它已设置”? (虽然不知道)

+1

是,$ var = null,设置变量的值为null;但isset($ var)将返回false;但在同一时间is_null($ var)将返回true :)这样一个有趣的语言:P – pomaxa

0

在这种情况下,如果你想销毁一个变量,你可以这样做: 有一个名为logout.php的页面,只要用户需要注销,重定向他/她到那个页面。现在,在该页面中,您将放置以下内容,并在此处向您解释这是什么:

<?php 
session_start(); //Initializes the session 
unset($_SESSION['thenameofyoursession']); //This unsets a specific session, so the user is logged out, in this case it would unset "thenameofyoursession". 
$URL="/test/home.php"; //This is the redirect URL 
header ("Location: $URL"); //This basically will send the user back to the redirect URL using header. 
die(); //terminates the PHP script from running 
?> 

因此,您应该没问题。

0

你的程序是相当明显的,类似于一个我们使用,但是,它会如果没有任何内容是有效的,则最好对整个会话进行unset()。 - 如果它们未登录,则不应存在会话变量。

logout.php脚本包含这样:

session_start(); 

session_register("loginMessage"); 
session_unregister("authenticatedUser"); 
session_destroy(); 

// relocate back to login page 
header("Location: /"); 

其中一期工程。 session_unset()历史上是多余的。

希望这会有所帮助。