PHP存储访客IP地址并统计回访次数的实现方案咨询
需求实现方案
第一步:调整stored_ip表结构
先执行下面的SQL修改原有表结构,新增统计所需字段并给IP字段加唯一索引:
ALTER TABLE stored_ip ADD COLUMN total_visits INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '终身累计访问次数', ADD COLUMN daily_visits INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '单日访问次数', ADD COLUMN last_visit_date DATE NOT NULL COMMENT '最后访问日期', ADD UNIQUE KEY `uk_ipaddr` (`ipaddr`);
第二步:修改原有PHP插入逻辑
把原有代码中INSERT相关的代码替换为下面的内容即可,利用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法实现自动判断IP是否重复、自动更新对应计数:
// 原有获取IP、数据库连接逻辑保持不变,只替换插入部分的代码 $currentDate = date('Y-m-d'); $sql = <<<SQL INSERT INTO stored_ip (ipaddr, last_visit_date) VALUES (:ipaddr, :last_visit_date) ON DUPLICATE KEY UPDATE total_visits = total_visits + 1, daily_visits = IF(last_visit_date = VALUES(last_visit_date), daily_visits + 1, 1), last_visit_date = VALUES(last_visit_date) SQL; $statement = $conn->prepare($sql); $statement->execute([ ':ipaddr' => $ip, ':last_visit_date' => $currentDate ]); // 可以新增代码获取当前IP的统计数据展示 $statSql = "SELECT total_visits, daily_visits FROM stored_ip WHERE ipaddr = :ipaddr"; $statStmt = $conn->prepare($statSql); $statStmt->execute([':ipaddr' => $ip]); $stats = $statStmt->fetch(PDO::FETCH_ASSOC); echo "<br/> 累计访问次数:" . $stats['total_visits']; echo "<br/> 今日访问次数:" . $stats['daily_visits'];
注意事项
- 原有
getIPAddress函数获取的HTTP_X_FORWARDED_FOR头可能存在多个代理IP,建议新增逻辑拆分取第一个非内网IP,避免统计异常 - 该方案不需要额外加查询判断逻辑,数据库层面自动处理并发访问的计数更新,不会出现计数错误
- 字段类型设置为UNSIGNED INT足够支撑普通站点的访问计数需求,若访问量极大可调整为BIGINT类型
内容的提问来源于stack exchange,提问作者LaravelBeginer
相关产品推荐
相关产品推荐

