我有点困惑。我有一个带有某种用户配置文件的网站。当访问者点击用户页面时,我想按日期和用户 ID 更新查看次数。但是,无论我做什么,观看次数都会更新为 2 而不是 1。我为在页面请求期间执行的所有查询创建了一个查询输出。更新查询是正确的,在页面请求期间只执行了 1 个更新查询。
这是我的数据结构:
CREATE TABLE `ProfileView` (
`Id` int(8) NOT NULL auto_increment,
`UserId` int(8) NOT NULL,
`Date` date NOT NULL,
`Views` int(8) NOT NULL,
PRIMARY KEY (`Id`),
KEY `UserId` (`UserId`,`Date`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
无论我做什么,“视图”列总是更新 2 而不是 1。
正在执行的逻辑(从控制器调用,控制器从视图调用。装饰器基本上是一个密封的标准类,提供严格的编码指导,因为拼写错误的属性会导致 PropertyDoesntExistException):
工作流程:
# user-details.php
$oControllerProfileView = new Controller_ProfileView();
$oControllerProfileView->Replace($iUserId);
---
# Controller.ProfileView.php
public function Replace($iUserId) {
// validation
Model_ProfileView::Replace($iUserId, date('Y-m-d'));
}
---
# Model.ProfileView.php
static public function Replace($iUserId, $sDate) {
$oData = MySQL::SelectOne("
SELECT Views
FROM ProfileView
WHERE UserId = ".$iUserId."
AND Date = '".$sDate."'");
if(is_a($oData, 'Decorator')) {
MySQL::Query("
UPDATE ProfileView
SET `Views` = ".($oData->Views + 1)."
WHERE UserId = ".$iUserId."
AND Date = '".$sDate."'");
} else {
MySQL::Query("
INSERT INTO ProfileView
VALUES (
NULL,
".$iUserId.",
'".$sDate."',
1
)");
}
}