【问题标题】:Stop a posted form from re-posting阻止已发布的表单重新发布
【发布时间】:2015-05-20 10:30:09
【问题描述】:

一旦页面中的数据被提交,我需要能够阻止页面发布。例如我可以有这个表格:

<form action='#' method='post'>
    <input type='text' name='name' />
    <input type='submit' name='submit' />
</form>

然后像这样抓住帖子:

<?php
if (isset($_POST['submit'])) {
    echo "Hello " .  $_POST['name'];
}
?>

但是当页面刷新时,它会一次又一次地执行相同的操作,直到用户离开页面或在页面上进行完全刷新。这给我带来了一个巨大的问题,因为一旦完成,我必须能够阻止帖子进行预演。

我曾尝试使用元标记 (&lt;meta http-equiv="refresh" content="5"&gt;) 来刷新页面,但这导致了一个问题,因为每隔几秒它就会这样做并且页面数据丢失,我试图取消设置 post 变量 (@ 987654324@ 和 unset($_POST);),但这不起作用,我不能使用 header("Location: ..."),因为我正在使用 WordPress,因此标题总是由系统发送。

所以我向我们的社区提出这个问题:如何阻止帖子重新提交数据?

编辑

我现在在做什么:

<?php
if (!isset($_SESSION)) {
    session_start();
}
$token = rand();
if ($_POST) {
    if (isset($_SERVER['token'])) {
        if($_POST['token'] == $_SESSION['token']){
            $continue = FALSE;
        }
        else {
            $continue = TRUE;
        }
    }
    else {
        $_SERVER['token'] = $_POST['token'];
        $continue = TRUE;
    }

    if ($continue === TRUE) {
        if (isset($_POST['update'])) {
            //Do update code
        }
        if (isset($_POST['win'])) {
            //Do win code
        }
        if (isset($_POST['credit'])) {
            //do credit code
        }
    }
}

表格:

<form method="post" action="#">
    <select name="select">
        <option value="false" <? if ($results->data[$i]['marked'] == "false") { echo "selected"; } ?>>No Attention</option>
        <option value="true" <? if ($results->data[$i]['marked'] == "true") { echo "selected"; } ?>>Needs attention</option>
    </select>
    <input type="hidden" name="token" value="<?php echo $token; ?>" />

    <input type="hidden" name="betid" value="<? echo $results->data[$i]['bet_id']; ?>" />
    <input name="update" id="" class="btn btn-default" value="Update" type="submit">
</form>

【问题讨论】:

  • 是的,本来只是一个管道,我的错
  • 您可以在提交之前生成一个令牌,然后将该令牌与表单一起发送,然后在提交表单后将令牌存储到会话中,然后检查会话令牌是否等于 POST /get token,如果是,则不执行提交,如果不是则执行。 (如果用户想提交新数据,表单中会生成一个新的token,但是刷新会保留旧的token。)
  • @Epodax,if (isset($_POST['submit'])) { if (!isset($_SESSION['token'])) { /*do action*/ $_SESSION['token'] = new_token(); } }?
  • 我会发布一个'答案,它会更容易解释。
  • 或者$posttoken = new_token(); 只在页面生命周期内持续?

标签: php html wordpress post


【解决方案1】:

你可以这样做:

<?php
$token = rand(); //Or how ever you want to generate a random token
?>

<form action='#' method='post'>
    <input type='text' name='name' />
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <input type='submit' name='submit' />
</form>

然后赶上帖子

<?php
if(isset($_POST['submit'])){
   if (isset($_SESSION['token']) ) {
       if($_POST['token'] == $_SESSION['token']){
           $continue = FALSE;
       }else{
           $continue = TRUE;
       }
   }else{
     $continue = TRUE;
   }

  if($continue === TRUE){
     $_SESSION['token'] = $_POST['token'];
     //DO SOMETHING
  }
}
?>

它可以适当地做得更小/更紧凑,但您应该了解代码背后的想法,这样如果已经提交数据的用户在访问新表单时可以提交新数据,但如果页面刷新数据将不再处理

当然你必须确保 SESSION 是 startet

【讨论】:

  • 这对我没有用,我添加了一个编辑,我的实际代码去掉了主要细节,如果我做错了什么,你能告诉我吗?
  • 表格在哪里?您使用 rand 生成的令牌应与表单一起提交 - 您还应将 $_SESSION['token'] = $_POST['token'] 放在 if($continue === true) 子句中
  • @SamSwift 见我上面的评论。
  • 我已经添加了表单并更新了代码中的PHP
  • @SamSwift 删除$token = rand();,您在if($_POST) 子句下方,还请记住,您需要在表单之前生成$token,以便在您将令牌回显到隐藏字段时它不会给你一个“未定义的变量”错误。
【解决方案2】:

这是一个完美的问题,可以链接我在 Stackexchange 上最喜欢的答案之一: https://softwareengineering.stackexchange.com/questions/46716/what-technical-details-should-a-programmer-of-a-web-application-consider-before

这个答案还说:

Redirect after a POST 如果 POST 成功,防止 再次提交刷新。

我建议你点击链接。

所以基本上是在提交帖子后重定向。当您发布信息时,您不会发布到您现在访问的页面,而是发布到重定向到您想要访问的页面的重定向。这将确保当您刷新时,它不会再次发布信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2021-09-30
    • 2021-04-23
    相关资源
    最近更新 更多