PHP-修复问题,其中会话仅在刷新后生效

时间:2011-07-04 04:49:39

标签: php forms session post header

请查看this Stackoverflow帖子。

我遇到与bob_cobb相同的PHP问题。这是Brad Chrisite的回答:

  

操作顺序。

     

放置会话创建和   有效性测试检查   页面顶部所以剩下的了   页面可以做出判断调用   存在$ _SESSION ['用户名']

     

(你可能正在尝试验证   他们在内容区域内,所以你的   “yay”或“ney”消息出现在   文件的所需部分。   漂亮,是的,但整个上半部分   页面看不到它   [可能]有效会话。)

他基本上说session_start()和检查会话变量的条件应该在顶部,这样页面的其余部分就可以根据它进行操作。

但是,我的会话检查 位于页面顶部。

<?php
session_start();

if ($_SESSION['username']) 
//User is already logged in, echo the log out button.
...    

else 
//User is not logged in, echo the log in form & button.
...    

//Login form validation if user is not logged in and submitted form.
//At the end, create session variable ($_SESSION['username'])

//Destroy session if user pressed log out button.
session_destroy();
?>

一切正常,但是,与其他问题的海报一样,我必须刷新页面,才能执行 顶部 脚本(检查脚本)对于$ _SESSION ['用户名'])。

为什么?

2 个答案:

答案 0 :(得分:2)

在整个控制流程完成之前,不要回显任何内容。我的意思是你应该努力将逻辑与显示分开(更好的是:使用像Model-View-Controller这样的模式)。在你的情况下,也许你可以做这样的事情:

<?php
/* Place all your control logic at the beginning.
   Do not echo anything in this block. */

session_start();

if ($_SESSION['username']) {
  $loggedin = true;
} else {
  $loggedin = false;
  ...    

  //Login form validation if user is not logged in and submitted form.
  //If login succeeded, set $loggedin to true.
  //At the end, create session variable.
}

//Destroy session if user pressed log out button.
  session_destroy();

/* Only display logic below, we do not change any state here */

if($loggedin) {
  echo logout button
} else {
  echo login form
}
?>

答案 1 :(得分:1)

答案很简单。进行用户注册后,您无需取消设置会话。 试试这个

<?php
session_start();

if ($_SESSION['username']) 
//User is already logged in, echo the log out button.
...    

else 
//User is not logged in, echo the log in form & button.
...    

//Login form validation if user is not logged in and submitted form.
//At the end, create session variable.

//Destroy session if user pressed log out button.
//session_destroy();
--- do a redirect or a refresh here .... 
?>