2012-05-11 69 views
0

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

感谢

+1

我从来没有做过这样的形式与任何东西,但我认为这样做会在加载的形式首次创建窗体键的最简单的方法,和将该密钥保存在文件或数据库中。提交表单时,它应该发布密钥,然后接收php脚本应该从有效密钥的文件或数据库中删除该密钥。 – Vulcan

+0

您是否尝试禁用提交按钮 –

回答

3

我想在这种情况下奉劝一些JavaScript。添加以下的提交按钮:

onclick="this.disabled=true;" 

一旦点击,使其无法再次点击这将禁用按钮。

+0

使用Noscript时不起作用。虽然这个和我所建议的组合会很好。 Stackoverflow真的需要复合答案:) – sinni800

+0

那么,如果用户足够聪明,可以安装noscript,他们也应该足够聪明,不要点击提交按钮两次。 –

+1

99%的用户将拥有javascript工作。安装了noscript的用户将理解表单提交的工作方式 – clem

3

您应该使用$_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?)"); 
} 
+0

感谢您的回答,但问题是这样的:我知道PHP,但不是很好。所以我不知道如何创建这个。我试过这个例子:http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmission,并且在一个知道php的人的帮助下调用,他可以实现这也是。你可能有一个示例代码/剪切?将不胜感激。我想标记你的答案作为解决方案,但如果我不能得到它的工作,那么我将不得不与大卫的javascript解决方案 – DextrousDave

+0

@DextrousDave在这里你去:) – sinni800

+0

谢谢,将测试这并报告回来 – DextrousDave

0

您就可以创建一个表单键:

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

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

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

+0

可以使用检查元素来操纵该值,但不应使用客户端验证。 –

+0

验证在服务器上完成。他们可以将价值改变为他们想要的任何东西,除非它与最近的订单相匹配,否则将失败 – Nate

+0

@Nate从用户的角度而不是从整个网站的角度看'$ last_order_datetime'?另外:如果一个请求在10秒内由于......情况而迟到,该怎么办?我知道,只是给它一个宽容:D – sinni800

1

除了搞乱PHP代码或DOM,为什么不修改你的数据库表来使用唯一键。这样,无论用户点击提交按钮的次数多少,数据库都不会在意。

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

+0

从建筑的角度来看,我会说最好的答案。但这意味着人们应该偏离通常的“AUTO_INCREMENT”模式。让数据库处理这样的事情总是一个不错的选择。通过程序代码执行一致性规则就是这么......很丑陋。我遇到过很多使用数据库存储的人,而不是验证它的内容:D – sinni800