0

我有点困惑。我有一个带有某种用户配置文件的网站。当访问者点击用户页面时,我想按日期和用户 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
            )");
    }
}
4

0 回答 0