表单提交后PHP会话变量出现问题

表单提交后PHP会话变量出现问题,php,session,Php,Session,我正在为提交的HTML表单设置一个带有成功消息的PHP会话变量。如果没有表单错误,我将重定向到同一页面(使用header())并显示来自会话变量的消息。在这里之前一切都很好,但是如果我在提交后再次访问该页面,消息仍然存在。是否可以仅在成功提交后重定向时使其显示 我的form.php代码如下所示: if (isset($_POST['submit'])) { // some form processing here if (count($errors) == 0) { // some d

我正在为提交的HTML表单设置一个带有成功消息的PHP会话变量。如果没有表单错误,我将重定向到同一页面(使用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 -->
{if-isset($smarty.session.status)}
{$smarty.session.status)

{/if}

谢谢。

显示消息后,只需清除会话变量就足够了吗

这似乎是最简单的解决方案。您还可以:

A)检查$\u服务器变量中包含哪些信息,以尝试检测用户是如何到达页面的,仅当消息发生在路由中时才显示消息

B)让重定向包含一个querystring变量(例如“?messages=1”),在显示会话消息之前使用$\u GET检查该变量


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

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

我说的是添加步骤5:在消息显示后删除它。如中所示,像您正在做的那样回显消息,但在回显后添加代码以删除或清除会话变量


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

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

销毁se会话:

将代码更改为如下所示

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

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

实际上不是,在显示消息后,将其放在form.php/your template file/的末尾:

unset($_SESSION['status']);

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


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

我想我做不到,因为我正在设置消息,然后重定向。我不想使用任何$\u GET变量。从上面的代码中可以看出,在显示消息后,我不能做任何操作。我听到了,我也不会做$\u GET解决方案,但我想我只是提到它以防万一。那我在编辑行之后所做的澄清呢?如果我正确理解了你的情况,那应该可以做到……你设置消息,重定向,显示它,然后取消设置消息。我唯一可以取消设置的方法是在模板文件中。我看不到任何其他方法。