gpt4 book ai didi

php - MD5 重复条目 mySQL

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:48 26 4
gpt4 key购买 nike

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

MySQL 错误:键“PRIMARY”的重复条目“39835a3f63f222c9bf51d9dd471b90bc”

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

有什么想法吗?

谢谢

最佳答案

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

  1. 去掉散列。使用 NOW() 将当前时间存储为 DATETIMETIMESTAMP。您实际上将拥有一个可排序的表格。
  2. 在日志文件中使用代理键,即 INTAUTO_INCREMENT
  3. 如果您需要存储准确、唯一的时间并避免重复,请查看 PHP 的 microtime()功能。

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

关于php - MD5 重复条目 mySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13313744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com