当谈到单个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
检查了我的表格,也没有出现任何错误。
有什么想法吗?
由于
答案 0 :(得分:3)
如果在同一秒内记录了2个条目,则它们将具有相同的哈希值。即使是使用率相当低的系统,这种情况也会比你想象的更频繁。我建议:
DATETIME
将当前时间存储为TIMESTAMP
或NOW()
。你实际上有一个可排序的表。INT
AUTO_INCREMENT
microtime()
函数。考虑一下,即使您将ID存储为8字节BIGINT
,它仍然比存储MD5哈希所需的VARCHAR(32)
小4倍。
答案 1 :(得分:0)
好吧,有时你可能遇到MD5哈希两次相同的情况。特别是如果(在您的情况下)某人每秒两次添加相同的电话号码 - 生成的哈希值肯定是相同的。为什么不使用自动增量主键?