在表单提交后使用PHP会话变量进行故障

时间:2010-06-15 23:18:05

标签: php session

我正在设置一个PHP会话变量,其中包含我正在提交的HTML表单的成功消息。如果没有表单错误,我将重定向到同一页面(使用header())并显示会话变量中的消息。一切都很好,直到这里,但如果我在提交后再次访问该页面,该消息仍然存在。是否可以在成功提交后重定向时才显示它?

我的form.php代码如下所示:

if (isset($_POST['submit'])) {
 // some form processing here
 if (count($errors) == 0) {
   // some data saving here
   $_SESSION['status'] = 'Thank you for submitting the form';
   header('Location: /form.php');
}

现在是我的模板文件:

{if isset($smarty.session.status)} 
  <p><strong>{$smarty.session.status)</strong></p> 
{/if}

<!-- form html code goes here -->

谢谢。

3 个答案:

答案 0 :(得分:2)

销毁会话:

将代码更改为类似

if(isset($_SESSION['sentData'])
{
echo "Your message";

//This
session_destroy();
//or this
unset($_SESSION['sentData']);
}

修改

实际上没有,在显示消息后将其放在form.php /您的模板文件的末尾:

unset($_SESSION['status']);

答案 1 :(得分:0)

在显示消息后清除会话变量是否足够?

这似乎是最直接的解决方案。你也可以:

A)检查$ _SERVER变量中的哪些信息,以尝试检测用户访问该页面的方式,只显示该消息是否发生在路径中。

B)让重定向包含一个查询字符串变量(例如'?messages = 1'),您可以在显示会话消息之前使用$ _GET进行检查。


编辑:我认为操作顺序是:

1)表单提交 2)如果没有错误,在会话中设置消息 3)重定向 4)重定向后显示消息

我说添加第5步:删除显示后的消息。就像在,回显你正在做的消息,然后在echo之后添加代码来删除或清除会话变量。


编辑2:啊,我现在明白了......

我很好奇你是否应该直接从你的模板文件引用会话变量。可能最好将其作为模板参数传递,该参数由调用模板的PHP设置?这使您能够将会话管理与显示分开,这可能符合您的最佳利益。

答案 2 :(得分:0)

在显示消息之前,您可以检查消息是否为空。如果它不为空,则显示该消息,然后立即显式清空会话变量,以便下次上一次检查不会显示该消息。

我希望我理解你的问题:)