2012-11-09 48 views
0

当涉及到单个mySQL脚本时,我遇到了一些问题;具体而言,MySQL总是给我这个错误:MD5重复项mySQL

MySQL Error: Duplicate entry '39835a3f63f222c9bf51d9dd471b90bc' for key 'PRIMARY'

这是很奇怪的原因主要涉及的关键是一个MD5生成基于散列关闭PHP的time()函数,所以不应该有任何的问题。

这是PHP代码插入到表中:

INSERT INTO log 
    (hailID, timestamp, lat, lng, phone, device, method, serviceType, email, address, languageID, ipaddress) 
     VALUES 
    (MD5('" . $time . $data['phone'] . "'), 
    '$time', 
    '".$data['lat']."', 
    '".$data['lng']."', 
    '".$data['phone']."', 
    '".$data['device']."', 
    '".$data['method']."', 
    '".$data['serviceType']."', 
    '".$data['email']."', 
    '".$data['address']."', 
    '".$data['languageID']."', 
    '".$_SERVER["REMOTE_ADDR"]."' 

$time在这种情况下,仅仅是从time()函数保持的值的变量。有趣的是,这个问题不是很频繁,而且似乎是随机的(至少据我所知)。是的,所有数据在进入$data阵列之前都使用mysqli_escape_string()进行消毒。我也使用CHECK TABLE检查了我的表格,也没有出现任何错误。

任何想法?

谢谢

+3

如果有人连续两次点击提交按钮,会发生这种情况。 – andrewsi

+0

你能举一个你的'$ time'变量的例子吗?如果它不是唯一的(即没有给出完整的日期/时间),那么你将每12/24小时碰撞一次。 – kurtzbot

+2

为什么要生成你自己的id,当你可以让mysql通过auto_increment来做,并保证唯一性?一个无符号的bigint可以让你启动2^64个ID。 –

回答

3

如果在同一秒内记录2个条目,它们将具有相同的散列值。即使是一个使用率较低的系统,这种情况发生的频率也比你想象的要高。我会建议:

  1. 废除散列。使用NOW()将当前时间存储为DATETIMETIMESTAMP。你实际上有一个可排序的表格。
  2. 使用日志文件中的INTAUTO_INCREMENT
  3. 如果你需要存储一个确切的,独特的时间和避免重复看看PHP的microtime()功能的代理键,即。

想想看,即使你存储的ID为8字节BIGINT它仍然比,你需要存储一个MD5哈希值的4倍VARCHAR(32)较小。

0

那么,有时你可能会碰到一种情况,当MD5哈希将相同的两次。特别是如果(在你的情况下)sb在一秒钟内增加两次相同的电话号码 - 生成的散列值肯定是相同的。为什么不使用自动增量主键?