使用后清除会话变量

时间:2010-07-27 20:29:41

标签: php session forms post login

是否可以使用会话变量,然后在?

后直接取消设置

示例:

//====
//Process Form
if ($_POST['Submit']) {
    $update = $userSettings->update($_POST);

    //If there are form errors
 if (!$update) {
        //Load the errors into an array
        $errors = $update[1];
    } else {
        //Set the session
        $_SESSION['showUpdated'] = true;

        //Redirect to this page
        header("Location: http://www.mysite.com/settings");
    }
}

//==================

if ($_SESSION['showUpdated']) {
 echo "Settings Updated";
    unset($_SESSION['showUpdated'];
}

所以提交表单后,如果没有错误:

  • 设置会话以表明表单提交正常
  • 重新加载页面(以防止重新提交POST数据)
  • 如果设置了'showUpdated'会话变量,则显示“已更新”消息
  • 取消设置会话变量(因此我们在下次重新加载时看不到该消息)

目前问题是,如果你直接取消设置会话变量;就好像你在“if exists”部分之前取消了它。

任何解决方案?这甚至是最好的方法吗?

非常感谢!

6 个答案:

答案 0 :(得分:23)

我注意到原始示例中的一个小错误可能会导致其他问题。

unset($_SESSION['showUpdated'];

需要

unset($_SESSION['showUpdated']);

不包括)中的unset结尾会导致错误。

答案 1 :(得分:3)

我不时这样做。我从来没有遇到任何问题。但是我要添加的内容是标题重定向后的exit()函数调用。

编辑:exit()的原因是它会阻止它处理任何进一步的代码,并且在您想要在重定向之后检查之前消除未设置的可能性。

答案 2 :(得分:3)

看起来它应该有效。确保在尝试使用会话之前调用session_start(),并在重定向标题之后始终退出()或die()。

我以不同的方式完成你所做的事情。我在会话中保留了一个“消息”元素。我会像“您的数据已保存”,错误消息等那样粘贴文本。然后,在每个页面上(实际上在页面模板类中),我检查$_SESSION['message']是否已设置且不为空。如果有什么东西,我会显示消息并将值设置为空字符串或null。

答案 3 :(得分:2)

之后没有退出的标题调用将继续运行页面。

header("Location: http://www.mysite.com/settings");
exit;

使用它代替,应该杀死页面而不是在同一页面调用上取消设置会话变量。

答案 4 :(得分:1)

只需检查它是否存在。这在定义之前是安全的,并且在定义之后将告诉您答案。

if(!empty($_SESSION['showUpdated'])) {

答案 5 :(得分:0)

或者您可以将其设置为false。

if ($_SESSION['showUpdated']) {
 echo "Settings Updated";
 $_SESSION['showUpdated'] = false;
}

看起来你使用的是比5.3更小的PHP版本,因为在5.3中你会在使用未初始化的值时得到通知。所以你应该使用isset函数:

if (isset($_SESSION['showUpdated']) && $_SESSION['showUpdated']) {
 echo "Settings Updated";
 $_SESSION['showUpdated'] = false;
}