使用后清除会话变量

Posted

技术标签:

【中文标题】使用后清除会话变量【英文标题】:Clear session variable after use 【发布时间】:2011-03-21 19:58:55 【问题描述】:

是否可以使用会话变量,然后直接取消设置?

例子:

//====
//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”会话变量,则显示“已更新”消息 取消设置会话变量(因此我们在下次重新加载时看不到消息)

目前的问题是,如果您立即取消设置会话变量;就好像您在“如果存在”部分之前取消设置它一样。

有什么解决办法吗?这甚至是最好的方法吗?

非常感谢!

【问题讨论】:

【参考方案1】:

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

unset($_SESSION['showUpdated'];

需要

unset($_SESSION['showUpdated']);

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

【讨论】:

【参考方案2】:

看起来应该可以。确保在尝试使用会话之前调用 session_start(),并始终在重定向标头之后调用 exit() 或 die()。

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

【讨论】:

【参考方案3】:

我经常这样做。我从来没有任何问题。但是我要添加到您的是在标头重定向之后的exit() 函数调用。

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

【讨论】:

【参考方案4】:

没有退出的头部调用将继续运行页面。

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

Exists 不是函数,你的意思是isset吗? 是的,就像那样。你能说我已经有一段时间没有用 php 编码了吗?谢谢@Anders S 我选择了 !empty,因为如果我没记错的话,如果数组或键不存在,它不会抛出任何警告、错误或异常。 如果您只关心变量是否存在,您应该使用 isset。如果变量为空字符串、0、NULL、false 或空数组,则 Empty 将返回 true。 这种情况下,总会有值,所以我不担心空字符串,0,NULL,false,或者空数组。如果数组键不存在,我认为 empty 不会记录警告,而 isset 会。【参考方案6】:

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

if ($_SESSION['showUpdated']) echo "设置更新"; $_SESSION['showUpdated'] = false;

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

if (isset($_SESSION['showUpdated']) && $_SESSION['showUpdated']) echo "设置更新"; $_SESSION['showUpdated'] = false;

【讨论】:

以上是关于使用后清除会话变量的主要内容,如果未能解决你的问题,请参考以下文章

浏览历史记录清除网页后注销[重复]

如何在不注销的情况下清除所有会话变量

如何清除所有会话变量而不退出

session_unset() 是清除和重置 PHP 会话变量的正确方法吗?

调用 Abandon() 后 ASP.net MVC 5 会话未清除

Laravel 会话文件未从 framework/sessions 文件夹中清除