0

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

谢谢

4

4 回答 4

3

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

onclick="this.disabled=true;"

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

于 2012-05-11T15:11:52.133 回答
3

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

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

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

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?)");
}
于 2012-05-11T15:12:36.000 回答
1
于 2012-05-11T15:18:19.287 回答
0

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

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

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

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

于 2012-05-11T15:14:40.593 回答