停止重新发布的已发布表单

时间:2015-05-20 10:30:10

标签: php html wordpress post

我需要能够在提交页面中的数据后停止发布页面。例如,我可以使用这种形式:

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

然后像这样抓住帖子:

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

但是当页面刷新时,它将同时执行相同的操作,直到用户离开页面或在页面上进行完全刷新。这导致了一个巨大的问题,因为我必须能够在完成任务后停止发布。

我尝试使用元标记(<meta http-equiv="refresh" content="5">)来刷新页面,但是这会导致一个问题,因为每隔几秒就会发生这种情况并且页面数据丢失了,我试图取消设置post变量(unset($_POST['submit']);unset($_POST);),但这不起作用,我不能使用标题(&#34;位置:...&#34;),因为我使用的是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>

2 个答案:

答案 0 :(得分:2)

你可以这样做:

<?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

答案 1 :(得分:1)

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

这个答案也说:

  

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

我建议你点击链接。

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