我正试图创建一个脚本,用于统计访问我的网站的访问者。为此,我记录访问者的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;只有在第二天,当日期改变的时候.我不知道问题出在哪里,这是我第一次用一个"IF“的"ON重复键”.
提前谢谢你!
发布于 2017-05-01 23:56:29
您的问题是重复的密钥只是在IP地址上,但是您的表在每个IP地址/日期组合中确实是唯一的。因此,随后几天的访问覆盖了前一天的行。
如果您将表的逻辑更改为在这两个字段上具有复合唯一键,则查询将生成新(IP,Date)组合体的插入,以及已经看到的(IP,date)组合体的更新。
如果您修复了这个问题,则不需要条件(当前日期也不需要PHP ),您只需将它作为SQL:
INSERT INTO `ChartsGuests` (`IP_Guest` , `Date`, `Total`)
VALUES ('".$IP_NewGuest."' , CURDATE(), 1)
ON DUPLICATE KEY UPDATE Total = Total + 1 )";https://stackoverflow.com/questions/43728037
复制相似问题