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

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


当前回答

我使用这个javascript行来阻止弹出窗口要求表单重新提交刷新一旦表单提交。

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

只需将这一行放在文件的页脚,就能看到神奇的效果

其他回答

如何防止php表单重新提交没有重定向。如果你正在使用$_SESSION(在session_start之后)和$_POST表单,你可以这样做:

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

在你的html表单中放这个:

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

因此,每当表单提交时,都会生成一个新的行为,存储在会话中并与后行为进行比较。

Ps:如果你正在使用一个Get表单,你可以很容易地用Get更改所有POST,它也可以工作。

$_POST['submit']变量在页面初始加载时不存在,并且只有在以下条件为真时才可以运行curl。

if($_POST['submit'] == "submit"){

// This is where you run the Curl code and display the output
  $curl = curl_init();



//clear $post variables after posting
$_POST = array();

}

使用头和重定向页面。 标题(“位置: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解决方案。

您可以通过会话变量防止表单重新提交。

首先,你必须在文本框中设置rand(),并在表单页面上设置$_SESSION['rand']:

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

在此之后,检查$_SESSION['rand']与文本框$_POST['randcheck']值 是这样的:

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

确保在使用session_start()的每个文件上都启动会话。