2012-11-09 46 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在一秒鐘內增加兩次相同的電話號碼 - 生成的散列值肯定是相同的。爲什麼不使用自動增量主鍵?