复制日期条目,奇数日期2012-12-10-1错误

时间:2012-12-10 01:46:55

标签: php mysql

有人要求修复几年前使用自定义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

奇怪的是它似乎有两个月的日期。我知道统计数据被添加到统计数据库中,并且它与另一个数据库重复。我只是无法使用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,我该如何解决这个问题呢?任何帮助表示赞赏。

根据@Roman Newaza的要求

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

1 个答案:

答案 0 :(得分:4)

当您有复合主键时,重复条目错误消息的格式设置为短划线分隔符,如X-Y,其中X是一列中的值,Y是第二列中的值。

在这种情况下巧合,默认日期格式中也有破折号。

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

因此,您要将date列设置为NOW(),这是' 2012-12-10'和第二个整数列(我猜测pageID)的值为' 1'。表格中已经列出了这两个值的组合,这是违反主键的原因。我从中推断出你的表定义类似于:

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-04之后看不到任何数据,我猜测重复键错误导致事务被回滚,所以导致错误的条目和行都是它与之相冲突。