【问题标题】:PHP $_POST form to expire if page reloaded如果页面重新加载,PHP $_POST 表单将过期
【发布时间】:2012-01-09 22:21:22
【问题描述】:

我有一个表单(用于 A),它重定向到另一个表单(表单 B)。

当用户被重定向到表单 B 时,如果设置了 $_POST,则会触发电子邮件功能。这是一个问题,如果用户重新加载页面,这封电子邮件会再次发送。

如果页面被重新加载,我想停止发送电子邮件。

因此,我在表单 A 中包含了一个字段,type=hidden 和 value=send,当发送电子邮件(表单 B)时,我取消了此字段,但如果我重新加载页面,电子邮件仍然会发送。

if(isset($_POST['emailtrigger'])){

            emailfunction();        
    unset($_POST['emailtrigger']);


  }

如何提示页面发送邮件后,如果页面(表单B)重新加载,跳过邮件功能?

谢谢

【问题讨论】:

  • 这就是303 redirects 的用途...
  • 您不能那样取消设置它们,因为它们是从客户端发送的。 PHP 是一种服务器端语言。您可以使用 PHP 会话来确定页面是否已重新发送。
  • @DaveRandom:你看到很多应该是 cmets 的答案,但这是一个应该是答案的评论。 :)
  • 为什么需要这样的链式表单处理程序?

标签: php forms post


【解决方案1】:

如果您想避免重定向,或者想保护自己免受用户按“返回”并在重定向后重新提交表单的影响,简单的解决方案是添加一个具有随机值的隐藏字段,该字段在加载表单时生成。表单提交后,只需将此字段值写入会话数据。然后,如果用户提交相同的表单数据,您将比较随机字段和会话数据中写入的内容。如果存在该值 - 您无需处理表单数据。

【讨论】:

  • 我实现了创建会话,在 if ($_POST && session['thevariable'] != '1'){ email... $_session['thevariable'] = 1个; } 当页面重新加载时,$_session['thevariable'] == 1,因此不会触发电子邮件谢谢
【解决方案2】:

这显然是通过在处理完表单后重定向到同一页面来完成的。因此,如果您的表单是由脚本form.php 处理的,那么在发送电子邮件后您应该进行重定向:

header('location: form.php');

这对用户是不可见的,并且在重新加载后不会再次发送 $_POST 值。

【讨论】:

  • 我需要 $_POST 通过表单 B 页面,所以我需要保持 $_POST 活动。我假设您的回复假设我摆脱了 form.php 中的 $_POST 并重定向到表单 B?
  • +1 表示“显然”这个词的使用——当我读到这个词时,我真的笑了。
  • @ibero - 虽然有多种方法可以应用基本原则 - 重定向的想法是避免触发 isset 后调用 - 取决于您如何设置。您可以使用会话来包含表单 1 的数据、隐藏字段等。选项很多。您甚至可以为电子邮件的发送次数设置一个会话变量,如果超过 1 次则阻止它。您的选择。
  • @IberoMedia 所以只需在表单 B 中使用重定向,如下所示:form A->form B->send email->redirect to form B
  • @Kai Qing 我希望你写这个作为答案。我最终实现了创建会话,在 if ($_POST && session['thevariable'] != '1'){ email... $_session['thevariable'] = 1; } 谢谢
【解决方案3】:

A 完成任务后,继续使用表单 B,$_POST 将可用。

一旦B完成,执行

header('location: formConfirm.php');
exit;

脚本formConfirm.php 将打印确认消息,仅此而已。特别是,它不应该更新数据库或发送电子邮件。

更一般地说,您可以实现一个通用的formConfirm.php,您总是使用它来呈现确认 - 例如以某种方式传递了实际的确认消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2013-01-05
    • 1970-01-01
    • 2017-01-22
    • 2020-10-16
    相关资源
    最近更新 更多