1

我可能不知道要搜索什么来获得这个答案,所以如果这个问题已经得到处理,请指出我正确的帖子。

现在,我有一个小自定义 CMS,我想确保用户不会通过刷新页面重新提交他们的 $_POST 数据。所以我做了这样的事情:

<?
  //Start a session to hold variables I want after my redirect
  session_start();
  if($_POST){ 

    //Do some php stuff and if I'm happy with the results...
    $_SESSION['some_vars'] = $whatever;

    //Bring me back here but without the $_POST data
    header('Location: '.THIS_PAGE);
    exit;

  }
?>

当脚本重新加载时,我使用我的会话变量并丢弃会话。

我想知道是否有人有更好的方法来处理这个问题。它相当不麻烦,但我一直在寻找更高的效率。

谢谢。

编辑:顺便说一句,如果我在做什么似乎不清楚,当您发布问题时,stackoverflow.com 会以某种方式执行此操作,但他们也会在他们处理时创建一个永久链接。

4

4 回答 4

1

您实际上已经实现了所谓的Post-Redirect-Get 模式,这绝对是一种正确的方法。我自己做这个。我经常使用它,我通常在我的基本控制器类中实现一些辅助函数来帮助我使用它:

public function prgRedirect($url = null, $sessionData = null)
{
    if ($sessionData !== null) {
        if (! isset($_SESSION)) session_start();
        $_SESSION['_PRG'] = $sessionData;
    }
    if ($url === null) $url = $_SERVER['HTTP_REFERER'];
    header("Location: ".$url);
}

public function getPrgData()
{
    if (! isset($_SESSION)) session_start();
    if (isset($_SESSION['_PRG'])) {
        $data = $_SESSION['_PRG'];
        unset($_SESSION['_PRG']);
    }
    else {
        $data = null;
    }
    return $data;
}

我通常将它与 REST 样式的 URL 一起使用,因此 POST 请求将执行它必须做的任何事情,使用 将一些数据保存到会话prgRedirect(),然后重定向回同一资源/页面的 GET url。GET 方法的处理程序将getPrgData()在执行的顶部调用并查看会话数据中是否有任何内容。

于 2010-01-10T19:55:35.600 回答
0

如果用户不插入相同的数据很重要,我确定您的数据库中必须有一些独特的列(可能像标题?)。所以只要检查这个标题是否已经存在。您不需要以这种方式使用任何会话

于 2010-01-10T19:30:03.627 回答
0

怎么样:
1. 生成随机字符串(uniqid 或 md5)
2. 将其存储在会话中并放入表单的隐藏输入中
3. 检查表单值和会话值 - 如果匹配 - 处理表单。清除会话值。

于 2010-01-10T19:31:31.813 回答
0

这里实际上有两个问题:

  • 当数据已经保存并且您在保存数据的页面中时,用户在浏览器中点击刷新按钮
  • 用户点击浏览器中的“返回”按钮并再次点击“提交”按钮。

在第一种情况下,最好的方案是遵循 GET-after-POST 模式,您可以在其中使用header("location:somewhere_else.php")调用来重定向用户。这样您就不必担心被连续调用两次,因为您发布数据的页面不在浏览器的历史列表中(因为服务器返回了 302 标头)。

第二种情况更痛苦,因为 GET-after-POST 没有帮助。如果用户提交了两次表单,您可能会保存两次数据。在这种情况下,可能有几种解决方案:

  • 在您发送给客户端的每个表单中放置一个“表单标识符”(一个随机字符串)。当客户提交表单时,检查会话数据中是否已经有这样的标识符。如果没有,请保存表单数据并将用户会话中的标识符记住为“已使用”。如果您在会话数据中找到标识符,请不要保存任何内容 - 它是重复的。
  • 检查数据库中提交的完全相同的值。如果它们匹配,请不要保存副本。但是,用户可能点击了“返回”按钮,更改了一些数据,然后重新提交了表单。
于 2010-01-10T20:27:52.167 回答