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. ハッシュを廃止します。現在の時刻をとして、DATETIMEまたはTIMESTAMPを使用して保存しNOW()ます。実際には、並べ替え可能なテーブルがあります。
  2. ログファイルで代理キーを使用しますINTAUTO_INCREMENT
  3. 正確で一意の時間を保存し、重複を避ける必要がある場合は、PHPのmicrotime()関数を調べてください。

IDを8バイトとして保存した場合でも、MD5ハッシュを保存するために必要なIDBIGINTの4分の1です。VARCHAR(32)

于 2012-11-09T18:26:00.133 に答える
0

そうですね、MD5ハッシュが2回同じになる状況に遭遇することがあります。特に(あなたの場合)sbが同じ電話番号を1秒間に2回追加する場合、生成されるハッシュ値は確かに同じになります。自動インクリメントの主キーを使用してみませんか?

于 2012-11-09T18:22:59.520 に答える