0

ハッシュタグ検索の結果を保存するphpスクリプトを作成しましたが、ツイートIDを保存すると、重複を保存しようとします。テーブルにUNIQUE制約を設定しましたが、明らかに最初のツイート以外は何も保存されず、以下のエラーがスローされます。これは驚くべきことではありません

ERROR: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2147483647' for key 2

制約を削除すると、すべてのツイートが正しく保存されますが、ツイートIDが重複します

テーブルに配置するために使用しているのと同じ変数からの出力にツイートを表示しようとしましたが、すべて一意で正しいため、変数は正しいです。だから私はいくつかの奇妙なことがそれ自体で起こっていると推測することができるだけです

foreach($results as $result) {
$tweet_ID = $result->id_str;
$userID = $result->from_user_id_str;
$tweetText = $result->text;
$tweet_time = strtotime($result->created_at);
$createdAt = date('Y-m-d H:i:s ',$tweet_time);

echo '<div>'. $tweet_ID . 
     '<div class="tweet" >' . displayTweet($result->text),"\r\n" .
        '<div class="user">'. '<strong>Posted </strong>' . date('j/n/y H:i:s ',$tweet_time). '<strong> By </strong>' . 
        '<a rel="nofollow" href="http://twitter.com/' . $result->from_user. '">' . $result->from_user .
        '</div>' .
     '</div>';  

// Execute query 
$stmt = $conn->prepare("INSERT INTO ".$hashtag."(tweetID, userID, tweetText, createdAt) VALUES(:tweetID, :userID, :tweetText, :createdAt)");
$stmt->execute(array(':tweetID' => $tweet_ID, ':userID' => $userID, ':tweetText' => $tweetText, ':createdAt' => $createdAt));
}
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

なぜ乱数を節約しているのか、一生理解できません

追加する番号は2147483647です。私には何の意味もありません。何が起こっているかについての助けをいただければ幸いです

4

1 に答える 1

2

この数値は、ツイートIDの保存に64ビット2147483647整数を 使用していないことを明確に示しています。ツイートIDは64ビット整数です。列にはデータ型を使用する必要があります。BIGINTtweetID

`tweetID` BIGINT UNSIGNED

取得する特別な値は、 64ビットのツイートIDが32ビット2147483647にキャストされるときにすべての上位ビットが切り捨てられるためです。もしあなたが使うことができれば、その数はもっと多かったでしょう。しかし、それ以上ではありません。ツイートIDはそれよりはるかに高いです。64ビットを使用する必要があります signed intunsigned int2147483647*2unsigned int

また、挿入クエリに動的テーブル名を使用しているようです。それをしないでください!パフォーマンスの問題が発生する前に、1つのテーブルに多数の行を保持できます。

于 2012-12-19T23:13:29.013 に答える