php:阻止表单重新提交

时间:2012-05-11 15:08:43

标签: php forms

我有一个php注册过程供用。当用户到达注册过程的倒数第二页时,它会显示所有注册详细信息和提交按钮的摘要(基本上是确认和付款按钮)。现在,当用户单击此按钮时,所有这些详细信息都会发布到sql数据库,并且该用户是使用用户名和密码在数据库中创建的。现在的问题是,如果您多次单击该提交按钮,它将重新提交数据并在数据库中创建重复条目,其中每个重复条目具有相同的详细信息(名称,电子邮件等),但具有不同的用户名和密码。 我该如何防止这种情况?我知道你可以提交并回复自我,但我该怎么做呢?我尝试实现此代码,但它不起作用:http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmission

由于

4 个答案:

答案 0 :(得分:3)

在这种情况下,我会建议一些JavaScript。将以下内容添加到提交按钮:

onclick="this.disabled=true;"

单击按钮后将禁用该按钮,以便不再单击该按钮。

答案 1 :(得分:3)

您应该使用$_SESSION将值保存到PHP会话中,以识别表单是否已提交。每次请求执行时都会锁定PHP会话,因此当第一次提交锁定它时,第二次提交必须等到第一次提交完成并设置了值。第二个请求将在之后读取它,并中断设置为已提交的值。

这是一个如何做到这一点的例子。如果一个用户一次进行多次注册,它可能会包含错误(为什么他应该这样做?)。

在包含表单提交按钮的页面上,您应该设置一个标记:

session_start();
$_SESSION["RegistrationSubmitted"] = false;

这表示用户当前正在进行的注册尚未提交。

在正在提交(POST)的页面上,您可以检查此值:

session_start();
if (isset($_SESSION["RegistrationSubmitted"]) {
    if ($_SESSION["RegistrationSubmitted"] == true) {
         die("Registration has already been submitted!");
    } else {
         // Process registration here
         $_SESSION["RegistrationSubmitted"] == true;
    }
} else {
    die("Last registration page hasn't been reached! (A bot?)");
}

答案 2 :(得分:1)

除了弄乱PHP代码或DOM之外,为什么不修改数据库表以使用唯一键。这样,无论用户点击提交按钮多少次,数据库根本不在乎。

这可能会对您有所帮助:“INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE”

答案 3 :(得分:0)

您可以创建一个表单键,如:

<input type="hidden" name="form-key" value="<?php echo $last_order_datetime; ?>" />

然后,当提交新订单时,检查$ _POST [&#39; form-key&#39;]的值是否与存储的最新订单完全相同。

如果是,请处理表格。 否则,这是重新提交或其他一些尝试。