0

当涉及到单个 mySQL 脚本时,我遇到了一些问题;具体来说,mySQL 不断给我这个错误:

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

这很奇怪,因为有问题的主键是基于 php 的 time() 函数的 MD5 生成的哈希,所以应该没有任何问题。

这是插入到表中的 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()函数值的变量。有趣的是,这个问题不是很频繁,而且似乎是随机的(至少据我所知)。是的,所有数据mysqli_escape_string()在进入$data阵列之前都会使用它进行清理。我还使用检查了我的表CHECK TABLE,也没有出现任何错误。

有任何想法吗?

谢谢

4

2 回答 2

3

如果在同一秒内记录了 2 个条目,它们将具有相同的哈希值。即使在使用率相当低的系统上,这种情况也会比您想象的更频繁。我会建议:

  1. 取消哈希。将当前时间存储为DATETIMETIMESTAMP使用NOW()。你实际上会有一个可排序的表。
  2. 在日志文件中使用代理键,即INTwithAUTO_INCREMENT
  3. 如果您需要存储准确、唯一的时间并避免重复,请查看 PHP 的microtime()函数。

想想看,即使您将 ID 存储为 8 字节,它仍然比存储 MD5 散列所需的 IDBIGINT小 4 倍。VARCHAR(32)

于 2012-11-09T18:26:00.133 回答
0

好吧,您有时会遇到两次 MD5 哈希相同的情况。特别是如果(在您的情况下) sb 在一秒钟内两次添加相同的电话号码 - 生成的哈希值肯定是相同的。为什么不使用自动递增主键?

于 2012-11-09T18:22:59.520 回答