我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。

我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。


当前回答

插入到数据库后,调用unset()方法清除数据。

设置($ _POST);

为防止刷新数据插入,请在记录插入后将页面重定向到同一页或不同页。

头(地点:。$ _SERVER [' PHP_SELF ']);

其他回答

插入到数据库后,调用unset()方法清除数据。

设置($ _POST);

为防止刷新数据插入,请在记录插入后将页面重定向到同一页或不同页。

头(地点:。$ _SERVER [' PHP_SELF ']);

使用头和重定向页面。 标题(“位置:your_page.php”);您可以重定向到相同的页面或不同的页面。 将$_POST插入数据库后取消设置。 设置($ _POST);

我还想指出,您可以使用javascript方法window.history.replaceState来防止在刷新和返回按钮时重新提交。

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

这里的概念证明:https://dtbaker.net/files/prevent-post-resubmit.php(链接不再工作)

我仍然推荐Post/Redirect/Get方法,但这是一个新颖的JS解决方案。

正如其他人所说,不可能不使用post/redirect/get。但与此同时,在服务器端做你想做的事情也很容易。

在POST页面中,只需验证用户输入,但不对其进行操作,而是将其复制到SESSION数组中。然后再次重定向到主提交页面。您的主提交页面首先检查您正在使用的SESSION数组是否存在,如果存在,则将其复制到本地数组中并取消设置。从那里你可以采取行动。

这样你只需要做一次主要的工作,就能完成你想做的事情。

使用Keverw answer的Post/Redirect/Get模式是个好主意。然而,你不能留在你的页面上(我认为这是你所要求的?)此外,它有时可能会失败:

如果web用户在首次提交完成之前刷新 由于服务器延迟,导致重复的HTTP POST请求在 某些用户代理。

另一个选择是存储在会话中,如果文本应该像这样写入SQL数据库:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}