PHP实现网站访问量统计:总访问、今日与昨日流量
本文详解如何使用 PHP 和 MySQL 构建一个基础的网站流量统计模块,涵盖总访问量、今日及昨日流量的数据展示。通过解析服务器时间与数据库记录日期的差异自动轮转统计数据,并结合 Cookie 机制实现同一访客的访问去重,提供完整的数据表结构设计与核心处理代码。
实现目标与准备条件
该功能旨在实时记录并展示网站的三类核心数据:
- 总访问量:网站运行以来的累计访问次数。
- 今日流量:当天内的新增访问量。
- 昨日流量:前一天的累计访问量(用于展示历史数据)。
实现此功能需要以下基础环境支持:
- 数据库:MySQL 5.0+ 版本,使用 InnoDB 引擎以保证事务安全。
- 后端语言:PHP 5.x/7.x(注:示例代码使用了较旧的
mysql扩展,实际生产环境建议迁移至mysqli或PDO)。 - Cookie支持:浏览器需允许 Cookie 存储,用于识别“新访客”与“老访客”。
数据库结构设计
首先需要创建一个名为 mycounter 的数据表,用于存储统计状态。表结构包含主键、当前计数器、昨日计数器、今日计数器以及最后更新日期。
CREATE TABLE `mycounter` (
`id` int(11) NOT NULL auto_increment,
`Counter` int(11) NOT NULL COMMENT '总访问量',
`CounterLastDay` int(10) default NULL COMMENT '昨日流量',
`CounterToday` int(10) default NULL COMMENT '今日流量',
`RecordDate` date NOT NULL COMMENT '最后更新日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=2 ;
创建表后,需插入一条初始记录,例如设置 ID 为 1,初始计数为 0,日期为当前日期,以便系统开始工作。
核心逻辑与操作流程
第1步:初始化访客标识 (Cookie 管理)
目的:区分新老访客,防止同一用户在单次会话中多次刷新导致流量虚高。
操作:在引入统计功能的页面顶部执行 Session 启动与 Cookie 检查。
<?PHP
session_start();
if (!isset($_COOKIE["user"])) {
// 第一次访问,设置新访客 Cookie,有效期 1 小时
setcookie("user", "newGuest", time()+3600);
} else {
// 已存在 Cookie,标记为老访客
setcookie("user", "oldGuest");
}
?>
第2步:获取并校验数据
目的:从数据库读取最新的统计值,并判断是否跨天。
入口:调用封装好的统计函数 ShowMyCounter()。
注意:原文代码逻辑较为冗长,此处保留其核心判断思路:比较当前年月日与数据库中的
RecordDate。若任一维度更大,则视为新的一天,触发计数器重置逻辑。
第3步:执行计数器更新逻辑
目的:根据时间判断结果,更新数据库中的各项指标。
- 跨天重置:如果检测到日期变更,将当日的
CounterToday赋值给CounterLastDay,并将CounterToday清零,同时更新RecordDate为今天。 - 增加计数:若请求者被标识为 “newGuest”(即不在过去 1 小时内有记录),则将
Counter和CounterToday各加 1,并写回数据库。
以下是整合后的 PHP 函数代码示例,修正了原文部分语法错误(如变量未定义前引用、SQL注入风险等),并保留了原有业务逻辑结构:
<?php
public function ShowMyCounter(){
// 1. 连接数据库请替换为您的实际配置
// $conn = mysqli_connect(...);
// 2. 读取当前状态
$querysql = "SELECT * FROM `mycounter` WHERE id = '1'";
$result = mysql_query($querysql); // 建议使用 mysqli/pdo
if (!$row = mysql_fetch_array($result)) return;
// 3. 时间对比逻辑
$dateNow = explode("-", date('Y-m-d'));
$recordDate = explode("-", $row['RecordDate']);
$isGone = FALSE;
// 简单的日期比较:年 > 年 OR 年==年且月 > 月 OR ... == ... 且日 > 日
if ($dateNow[0] > $recordDate[0]) {
$isGone = TRUE;
} else if ($dateNow[0] == $recordDate[0]) {
if ($dateNow[1] > $recordDate[1]) {
$isGone = TRUE;
} else if ($dateNow[1] == $recordDate[1]) {
if ($dateNow[2] > $recordDate[2]) {
$isGone = TRUE;
}
}
}
// 4. 如果是新的一天,执行重置操作
if ($isGone) {
$upd_sql = "UPDATE mycounter
SET RecordDate = '" . date('Y-m-d') . "',
CounterToday = 0,
CounterLastDay = " . $row['CounterToday'] . "
WHERE id = '1'";
mysql_query($upd_sql);
}
// 5. 再次获取最新数据以进行累加判断
$result = mysql_query($querysql);
$row = mysql_fetch_array($result);
// 6. 仅对新访客增加计数
if (isset($_COOKIE["user"]) && $_COOKIE["user"] != "oldGuest") {
$newCounter = ++$row['Counter'];
$newToday = ++$row['CounterToday'];
$updateCountSql = "UPDATE mycounter
SET counter = '$newCounter',
CounterToday = '$newToday'
WHERE id = '1'";
mysql_query($updateCountSql);
}
// 7. 输出结果
echo "总访问量:" . $row['Counter'];
echo "
";
echo "今日流量:" . $row['CounterToday'];
echo "
";
echo "昨日流量:" . $row['CounterLastDay'];
}
?>
完成判断
当上述代码部署到您的网页头部或公共包含文件中,并确保数据库中有一行有效记录时,页面加载即可看到类似以下的效果:
- 总访问量:动态数字
- 今日流量:当日累计数
- 昨日流量:昨日全天总数
若连续刷新页面(1小时内),总访问量与今日流量不应继续增加,表明 Cookie 去重逻辑生效。
简要总结
以上是对 PHP 实现网站基础流量统计功能的详细内容,主要涉及数据库状态维护与访客身份识别。更多关于 PHP 网站开发及数据统计的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













