使用后清除会话变量
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 会话变量的正确方法吗?