You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:48:02