最近没什么事做想到给博客添加一个流量统计模块,网络找了一圈没有找到心仪的,于是就自己写了一个,也就有了这篇文章。
废话不多说,直接上源码:
效果演示
以下是代码展示:index.php
<?php
//引入数据库
include("db.php");
//获取当前访问用户的IP地址
$ip = $_SERVER["REMOTE_ADDR"];
$fwcs = "";
$zrfwcs ="";
//判断同一个IP在15分钟内时候访问过,有不计入次数
//查询表
$sql = "SELECT * FROM `statuser` WHERE `IP` = '" . $ip . "'";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 指定时间
$targetTime = "";
$id = "";
// 查询有结果 判断15分钟内是否有过访问 没有继续添加
while ($row = $result->fetch_assoc()) {
// 指定时间
$targetTime = $row["time"];
$id = $row["id"];
}
// 将指定时间转换为时间戳
$targetTimestamp = strtotime($targetTime);
// 获取当前时间戳
$currentTimestamp = time();
// 计算两个时间戳之间的差值
$timeDiff = $currentTimestamp - $targetTimestamp;
// 判断差值是否超过15分钟(900秒)
if ($timeDiff > 900) {
@$sql = "UPDATE `statuser` SET `time` = " . CURRENT_TIMESTAMP . " WHERE `statuser`.`id` = '" . $id . "'";
// 执行查询并获取结果
if ($db->query($sql) === TRUE) {
} else {
echo "SQL 语句执行失败: " . $db->error;
}
//添加访问次数
//先查询现有然后再现有的基础上加一
$sql = "SELECT * FROM `statnum` WHERE `id` = 1";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 获取访问次数
while ($row = $result->fetch_assoc()) {
$fwcs = $row["fwcs"];
}
$sql = "UPDATE `statnum` SET `fwcs` = '" . ($fwcs + 1) . "' WHERE `statnum`.`id` = 1";
if ($db->query($sql) === TRUE) {
} else {
echo "SQL 语句执行失败: " . $db->error;
}
} else {
echo "没有找到相关数据";
}
}
} else {
// 查询无结果 在数据库中添加
$sql = "INSERT INTO `statuser` (`IP`, `time`) VALUES ('" . $ip . "', CURRENT_TIMESTAMP)";
mysqli_query($db, $sql);
$sql = "SELECT * FROM `statnum` WHERE `id` = 1";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 获取访问次数
$fwcs = "";
while ($row = $result->fetch_assoc()) {
// 指定时间
$fwcs = $row["fwcs"];
}
echo $fwcs;
$sql = "UPDATE `statnum` SET `fwcs` = '" . ($fwcs + 1) . "' WHERE `statnum`.`id` = 1";
if ($db->query($sql) === TRUE) {
} else {
echo "SQL 语句执行失败: " . $db->error;
}
}
}
//告诉访问者他是第几个访问者
$sql = "SELECT * FROM `statnum` WHERE `id` = 1";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 获取访问次数
while ($row = $result->fetch_assoc()) {
$fwcs = $row["fwcs"];
}
} else {
echo "没有找到相关数据";
}
//统计今日访问人数
// 获取当前年月日
$date = date('Ymd');
// 查询是否有名为$datastat的列,并且值等于当前年月日
$tableName = "datastat";
$columnName = "datastat";
$result = mysqli_query($db, "SELECT * FROM $tableName WHERE $columnName='$date'");
$datafwcs = "";
if (mysqli_num_rows($result) > 0) {
//echo "列 $columnName 等于 $date 存在";
//先查询现有然后再现有的基础上加一
$sql = "SELECT * FROM $tableName WHERE `$columnName` = '$date'";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 获取访问次数
while ($row = $result->fetch_assoc()) {
$datafwcs = $row["fwcs"];
}
$sql = "UPDATE `$tableName` SET `fwcs` = '" . ($datafwcs + 1) . "' WHERE `$columnName` = '$date'";
if ($db->query($sql) === TRUE) {
} else {
echo "SQL 语句执行失败: " . $db->error;
}
} else {
echo "没有找到相关数据";
}
} else {
// 插入名为$datastat的列,并设置值为当前年月日
$sql = "INSERT INTO `datastat` (`datastat`, `fwcs`) VALUES ('20230403', '0')";
if (mysqli_query($db, $sql)) {
//echo "列 $columnName 值为 $date 插入成功";
} else {
echo "列 $columnName 值为 $date 插入失败:" . mysqli_error($db);
}
}
//获取前一日浏览量
$date = date('Ymd') - 1;
$sql = "SELECT * FROM $tableName WHERE `$columnName` = '$date'";
$result = mysqli_query($db, $sql);
if (mysqli_num_rows($result) > 0) {
// 获取访问次数
while ($row = $result->fetch_assoc()) {
$zrfwcs = $row["fwcs"];
}
} else {
echo "没有找到前一天的相关数据";
}
//打印数据
echo "<span>你的IP是:" .$ip. "</span>";
echo "<span style='margin-left: 0.5rem'>总访问次数:" . $fwcs . "</span>";
echo "<span style='margin-left: 0.5rem'>今日浏览量:" . ($datafwcs+1) . "</span>";
echo "<span style='margin-left: 0.5rem'>昨日浏览量:" . $zrfwcs . "</span>";
echo "<span style='margin-left: 0.5rem'>日差浏览量:" . ($datafwcs+1 - $zrfwcs) . "</span>";
// 关闭数据库连接
$db->close();
db.php:
<?php
$servername = 'localhost';
$username = 'webstat';
$password = 'webstat';
$dbname = 'webstat';
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die('数据库链接失败' . $conn->connect_error);
}
$db = $conn;
$cs = "<script>alert()</script>";可以这样调用
<iframe src="统计链接即统计源码的访问地址" border="0" frameborder="no" marginwidth="0" marginheight="0" width=660 height=30"></iframe>有能力可以自行二开
测试邮件通知
测试1
测试2