【问题标题】:php browser back after postphp浏览器在发布后返回
【发布时间】:2012-07-27 20:25:43
【问题描述】:

我有 php 页面,我使用表单提交消息。它向自己提交:

action="<? php echo $_SERVER['PHP_SELF'];?>"

然后它发送电子邮件,我有一个使用 jnotify 的 javascript 函数来提醒消息是否发送成功。此函数检查 php 变量 $sent=='yes' 是否通知成功消息,否则通知错误。

问题是当用户发送消息并转到另一个页面并使用浏览器返回按钮返回时,它正在显示通知。我希望它只显示一次通知,并在浏览器返回或刷新使用时忘记通知。

什么是最好的解决方案?

【问题讨论】:

  • 首先,由于XSS,尽量不要使用$_SERVER['PHP_SELF'],除非你过滤了HTML。因此,您的网页可能非常不安全。 (据我所知,就是这样;从未测试过 - 只是读了很多。)
  • @RobinV。 - $_SERVER['PHP_SELF'] 怎么不安全?你能指出一些文章吗?
  • @Paul - 您可以在 Google 上轻松找到它们,只需输入“php form php_self security”,就会弹出一些。问题当然是,是否相信他们。

标签: php browser notifications back


【解决方案1】:

试试这样的:

<?php

session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (form_is_valid()) {
        $_SESSION['form_success'] = true;
    } else {
        $_SESSION['form_success'] = false;
    }
    header('Location: ' . $_SERVER['PHP_SELF'];
    exit;
} else if (isset($_SESSION['form_success'])) {
    if ($_SESSION['form_success'])) {
        // insert success javascript
    } else {
        // insert failure javascript
    }
    unset($_SESSION['form_success']);
}

// display_form

这样他们应该只看到一次成功/失败消息,如果他们稍后使用后退按钮,他们将不会收到有关重新提交帖子数据的警告,他们也不会看到成功/失败消息两次。 javascript 应该显示的唯一时间是他们刚刚在最后一个请求中提交了表单。

【讨论】:

  • 我在顶部有 if(isset($_POST['submit'])) {} 函数,如何用我的代码实现你的代码?
  • $_SERVER['REQUEST_METHOD'] == 'POST' 可以替换为您拥有的isset($_POST['submit'])
  • 对不起,它没有用。我认为在 header('Location: ' . $_SERVER['PHP_SELF']; exit; SESSION 的值丢失
  • 对后续请求执行var_dump($_SESSION);。 $_SESSION 变量在请求中持续存在。
  • 再次抱歉。你的代码很好用!这是我愚蠢的错误。我忘了打电话 session_start();在顶部。我通常创建我的 Session 类并使用 session_start();在里面,但这次我没有。非常感谢!
【解决方案2】:

您可以使用 ajax 请求来发送您的表单。

$.ajax({
  type: 'POST',
  url: processor.php,
  data: $('#form_id').serialize(),
  success: function(data){
       if(data==0){ alert('message sent'); }else{ alert('message not sent'); }
  }
});

【讨论】:

    【解决方案3】:

    我认为 Zend Helper Flash messenger 可能是您正在寻找的。

    “这意味着该消息将在下一个请求时可用于检索,但在之后的请求中不可用。”

    additional documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2013-07-20
      相关资源
      最近更新 更多