【问题标题】:How do I prevent duplicate entrys to mySQL?如何防止对 mySQL 的重复条目?
【发布时间】:2010-03-30 19:21:09
【问题描述】:

在我的网站上,我有一张表格,用户填写后即可成为会员。他们填写姓名、生日、电子邮件等。然后当他们点击提交时,数据进入 mySQL。但有时当用户多次点击提交或刷新页面时,数据会多次输入到数据库中。如何防止这种意外提交?有没有可以让一组数据进入数据库的代码?

这也是我评论区的一个问题。我允许将 cmets 放在人们的个人资料上。但是当他们滥用刷新按钮或提交按钮时,我会得到 10 个相同的 cmets。我试图防止用户意外提交两次评论。

谢谢。

【问题讨论】:

  • 不要建立自己的帐户创建/身份验证机制。这在之前已经完成了 10000 次。使用另一个已经过测试并且没有错误的预先存在的。这样做的唯一原因是为了体验/了解登录系统的生产实现如何演变。真的,这是您想成为专家,还是更愿意专注于您正在解决的问题的领域?

标签: php mysql


【解决方案1】:

创建唯一约束:

CREATE UNIQUE INDEX name_of_youw_index ON tablename(columnname);

INSERT 现在会因双数据而失败。

【讨论】:

  • 我的表名为accounts。我应该让帐户表中的 user_id(a field) 唯一吗?那么这是正确的吗? CREATE UNIQUE INDEX user_id ON accounts(user_id);
  • @ggfan: user_id 不是你的自增列吗?
  • 是的。我没有完美地表达我的问题。我希望用户不能通过刷新页面等意外提交两次数据。允许他们再次提交相同的数据。
  • @ggfan:然后将唯一约束放在其他列上,以确保它不是重复的:电子邮件地址应该足够了。
  • @S.Lott:看看他的第二个 cmets 示例。你会在那里做什么?
【解决方案2】:

在第一种情况下,您可能只想在电子邮件地址上添加一个唯一索引并使用它为该用户创建个人资料。

在第二种情况下,据我了解,您试图防​​止用户意外提交数据两次,而不是完全防止数据被提交两次。您可能不想阻止人们在同一页面上两次写相同的评论。如果有人写“今天就像昨天!”,你不想阻止他们第二天回来写“今天就像昨天!”再次。这将是不自然的,并且检查可能会很昂贵,因为它需要索引大量数据。我认为您想阻止某人两次提交相同的表单,无论数据是否相同。

因此,第二个示例的解决方案是在表单中包含一个唯一标识它的隐藏字段。当他们提交表单时,将隐藏字段中的值标记为已使用。如果有人稍后提交了隐藏字段中具有相同值的表单,则拒绝它。

【讨论】:

  • 然后一些聪明人破解了你的隐藏字段(甚至我妈妈也能做到),你又得到了双重数据。
  • @Frank:我想你误解了我的意思。阅读我更新后的帖子,我在其中进行了更详细的解释。
  • 是的,我正在努力防止意外提交数据两次。
  • @ggfan:那你为什么不在处理完数据后做重定向呢? en.wikipedia.org/wiki/Post/Redirect/Get
【解决方案3】:

服务器端:实施节流。仅允许每 10 秒左右提交 1 次。

更新:当您接受表单提交时,记录您的时间戳 在 $_SESSION 中提交。 当你接受另一个(或者更确切地说, 每)表单提交,检查是否 $_SESSION 中存储的值较旧 超过 10 秒。如果是,请继续。 如果不是,请不要再做任何工作。

你可以用一些 我猜是数据库的东西,但是 $_SESSION 要简单得多。

客户端:提交表单时通过Javascript禁用提交按钮。

【讨论】:

  • 注意:即使按钮被禁用,在使用后退和前进按钮或按 F5 时,仍有可能意外再次提交相同的数据。通常会显示警告,但很多人可能不阅读或不理解这些警告。
  • 我该如何每 10 秒左右提交一次?我可以执行一旦点击就禁用提交按钮的 javascript。
【解决方案4】:

通过向其添加唯一索引,使数据库中的电子邮件字段“唯一”。

如果您的数据库收到另一个条目,其中包含已使用的电子邮件,那么 mysql 会抛出一个错误 - 错误号是 1062。

如果您愿意,那么您可以处理与其他错误不同的错误。

mysql_errno()

http://www.php.net/manual/en/function.mysql-errno.php

【讨论】:

    【解决方案5】:

    在数据库重复的情况下,对字段设置唯一约束。

    对于数据库重复和重复的cmets,在按下提交按钮2-3秒后禁用提交按钮,以防止多次提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2015-11-29
      • 2012-02-07
      相关资源
      最近更新 更多