php - INSERT ON DUPLICATE KEY UPDATE IF 语句

标签 php mysql

我正在尝试创建一个脚本来统计有关我网站的访问者的信息。为此,我记录了访问者的 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 DUPLICATE KEY”.. .

提前谢谢您!

最佳答案

您的问题是您的重复键仅位于 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 )";

关于php - INSERT ON DUPLICATE KEY UPDATE IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43728037/

相关文章:

javascript - http_origin 可以被欺骗吗?

php - 如何使用ffmpeg php检查视频是横向还是纵向?

php - Laravel/Eloquent attach() 方法绕过了我的 Multi-Tenancy 特征

mysql - 将多个表与 Rails 中的事件存储连接起来

php - 基于其他表自动向mysql表添加列的方法

java - PHP 到 Java - 套接字

PHP/MySQL 多关键字复杂搜索

python - 使用 SQLAlchemy ORM 基于多对一关系中的一个对象过滤查询

php - 将相同的值插入数据库两次

javascript - Sequelize 属于在一个查询中同时获取两种关系的多类