我正在尝试为有关我网站访问者的统计信息创建脚本。为此,我记录访问者的IP,以及当天的日期和通过的次数。 如果这是第一次访问,则在数据库中的所有记录上。但我想每人每天计算一次通行证。
我想要做的事情:如果IP已经存在,并且日期与当天不同:我们分配当天的日期,并增加传递次数(+1)
问题:当日期与当天不同时,它会被更改,但是:即使当天已经计算了IP,传递次数也会继续增加。
它应该只在第二天完成,当日期改变时......
这是我的表结构:
--
-- Table structure for table `ChartsGuests`
--
CREATE TABLE `ChartsGuests` (
`IP_Guest` varchar(39) NOT NULL,
`Date` varchar(10) NOT NULL,
`Total` int(11) NOT NULL,
PRIMARY KEY (`IP_Guest`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB DEFAULT CHARSET=utf8;
以下是代码:
$IP_NewGuest = $_SERVER['REMOTE_ADDR'];
$Today = date('d/m/Y');
$SQL = "INSERT INTO `ChartsGuests` (`IP_Guest` , `Date`, `Total`) VALUES ('".$IP_NewGuest."' , '".$Today."', 1)
ON DUPLICATE KEY UPDATE
Date = IF(Date != '".$Today."', VALUES(Date), '".$Today."'),
Total = IF(Date != '$Today', VALUES(Total), Total + 1 )";
$REQ = $DB->prepare($SQL);
$REQ->execute() or die(var_dump($REQ->errorInfo()));
// echo $SQL;
它应该只在第二天完成,当日期改变时......我不知道问题来自哪里,这是我第一次使用" ON DUPLICATE KEY"用" IF" ...
提前谢谢!
答案 0 :(得分:1)
您的问题是您的重复密钥只在IP地址上,但您的表对于每个IP地址/日期组合而言确实是唯一的。因此,后续日期的访问会覆盖前一天的行。
如果更改表的逻辑以在这两个字段上具有复合唯一键,则查询将生成新(IP,日期)组合的插入,以及已经看到的(IP,日期)组合的更新。
如果你解决了这个问题,你不需要条件(当前日期也不需要PHP),你可以把它作为你的SQL:
INSERT INTO `ChartsGuests` (`IP_Guest` , `Date`, `Total`)
VALUES ('".$IP_NewGuest."' , CURDATE(), 1)
ON DUPLICATE KEY UPDATE Total = Total + 1 )";