php:防止表单重新订阅


php: Preventing Form re-submisson

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

谢谢

在这种情况下,

我会建议使用一些JavaScript。将以下内容添加到提交按钮:

onclick="this.disabled=true;"

这将在单击按钮后禁用该按钮,以便无法再次单击它。

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

下面是如何完成此操作的示例。如果一个用户一次进行多个注册,它可能会包含错误(他为什么要这样做?

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

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

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

在提交(发布)到的页面上,可以检查此值:

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?)");
}

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

这可能有助于您:"插入忽略"与"插入...在重复键更新"

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

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

然后,当提交新订单时,检查 $_POST['form-key'] 的值是否完全等于最近存储的订单。

如果是,请处理表单。否则,它是重新提交或其他尝试。