有人要求修复几年前使用自定义 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 在表中找到此条目。我试着修理 table ,但没有用。该错误由 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
最佳答案
当您有复合主键时,重复输入错误消息的格式为破折号分隔符,例如 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之后的数据,我可以猜测是duplicate key错误导致事务回滚,所以导致错误的entry和冲突的row与被撤消。
关于php - 具有奇数日期 2012-12-10-1 错误的重复日期条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793915/