1

誰かが、カスタムCMSを使用して数年前に作成されたデータベースのエラーを修正するように依頼しました。私はまだ主にフロントエンドの人ですが、私はこの種のプロジェクトにどんどん入り込んで学ぼうとしています。今示されているエラーは

 Fatal error: Duplicate entry '2012-12-10-1' for key 'PRIMARY' INSERT INTO stats SET pageID = '1', date = NOW(), visits = 1, views = 1 in /home/site/domains/domain.nl/public_html/cms/inc/functions.inc.php on line 10

奇妙なのは、2か月あるように見える日付です。統計が統計データベースに追加されていて、それが別のデータベースの複製であったことを理解しています。PHPMyAdminを使用しているテーブルでこのエントリを見つけることができません。テーブルを修理してみましたが、うまくいきませんでした。エラーは、functions.inc.phpのこの関数によって発生します。

function executeQuery($query) {
    global $website;
    static $count;
    benchmark("mysql", "start");
    if ($query == "count") {
        return $count;
    }
    $count++;
    $result = mysql_query($query, $website->DBConnection) or trigger_error("\n" . mysql_error() . "\n" . $query, E_USER_ERROR);
    $time += (microtime(true) - $tmp);
    benchmark("mysql", "stop");
    return $result;
}

Page.class.phpの関数は次のとおりです。

public function updateStats() {
        $result = executeQuery("SELECT count(*) FROM stats WHERE pageID = '" . $this->id . "' AND date = NOW()");
        $firstTime = mysql_result($result, 0) == 0;

        if ($firstTime) { // First time today someone visit this page
            executeQuery("INSERT INTO stats SET pageID = '" . $this->id . "', date = NOW(), visits = 1, views = 1");
            $_SESSION["stats"][$this->id] = true;
        } else {
            if (!$_SESSION["stats"][$this->id]) { // First time today this person visit this page
                executeQuery("UPDATE stats SET visits = visits + 1, views = views + 1 WHERE pageID = '" . $this->id . "' AND date = NOW()");
                $_SESSION["stats"][$this->id] = true;
            } else { // Second or more time someone visit this page.
                executeQuery("UPDATE stats SET views = views + 1 WHERE pageID = '" . $this->id . "' AND date = NOW()");
            }
        }
    }

そのエラー以来、サイトはダウンしているようです。2012-10-04以降に入力された統計は表示されません。DUPLICATEと呼ばれるそのような日付をどのように作成できますか?また、これを修正するにはどうすればよいですか?どんな助けでも大歓迎です。

@RomanNewazaからのリクエストに応じて

SHOW CREATE TABLE stats
stats   CREATE TABLE `stats` (
 `date` date NOT NULL DEFAULT '0000-00-00',
 `views` int(11) NOT NULL DEFAULT '0',
 `visits` int(11) NOT NULL DEFAULT '0',
 `pageID` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`date`,`pageID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
4

1 に答える 1

4

複合主キーがある場合、重複エントリ エラー メッセージは のようX-Yにダッシュ区切りでフォーマットされます。X は 1 つの列の値で、Y は 2 番目の列の値です。

この場合、デフォルトの日付形式にもダッシュが含まれているのは偶然です。

INSERT INTO stats SET pageID = '1', date = NOW(), visits = 1, views = 1

したがって、列を '2012-12-10' である NOW() に設定し、値が '1' のdate2 番目の整数列 (私は推測しています) を設定しています。pageIDこれら 2 つの値の組み合わせは既にテーブルにあり、それが主キーに違反しています。これから、テーブル定義は次のようになると推測します。

CREATE TABLE stats (
  `date` DATE NOT NULL,
  `pageID` INT NOT NULL,
  `visits` INT NOT NULL,
  `views` INT NOT NULL,
  -- possibly more columns
  PRIMARY KEY (`date`, `pageID`)
);

2012 年 12 月 4 日以降にデータが表示されない理由については、重複キー エラーが原因でトランザクションがロールバックされたため、エラーの原因となったエントリと競合した行の両方が元に戻されたと推測できます。 .

于 2012-12-10T01:55:08.660 に答える