我有一个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'] 的值是否完全等于最近存储的订单。
如果是,请处理表单。否则,它是重新提交或其他尝试。