用PHP做一个自己的访问统计
· server
原因
为什么自己写
因为在自己域下,可控&不会被常见的去广告插件屏蔽
为什么选择PHP
我曾经试图用CSS方法实现,奈何技术有限,且我不是专业的前端和后端。不过如果有兴趣的朋友可以看看这个文章 https://herman.bearblog.dev/how-bear-does-analytics-with-css/ 。这个作者简单介绍了自己如何使用CSS方法进行统计并计算PV之类的数据。
且我希望是放在主题文件下可以直接运行和使用,没有想在服务端运行docker或者其他程序
它有什么功能
机制简单的统计,访问+1,刷新+1,如此而已
开始
创建数据库
首先你需要创建数据库,如果你有数据库的前提下,请使用下面的语句新建一张这样的表:
CREATE TABLE statistics (
id INT AUTO_INCREMENT PRIMARY KEY,
site_name VARCHAR(255) NOT NULL,
visit_count BIGINT NOT NULL DEFAULT 0
);
这个表里只包含了一个网站地址和这个网站相对应的访问数量。它的结构大概是:
sitename | visit_count |
---|---|
banzhuanriji.com | 123 |
然后我们初始化一下:
INSERT INTO statistics (site_name, visit_count) VALUES ('banzhuanriji.com', 0);
新建一行banzhuanriji.com
的数据,且把默认数据(访问量)设置为0
实现代码
首先在你的主题目录下创建一个counter.php
的文件,文件内容如下
<?php
$servername = "localhost";
$username = "statistics";
$password = "password";
$dbname = "statistics";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname, 3306);
// 检查连接
if ($conn->connect_error) {
die("连接失败,请稍后再试。");
}
// 指定网站名称
$site_name = 'banzhuanriji.com'; // 这里修改为需要统计的网站名称
// 更新浏览次数
$sql = "UPDATE statistics SET visit_count = visit_count + 1 WHERE site_name = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $site_name); // 绑定网站名称
$stmt->execute();
// 获取当前浏览次数
$sql = "SELECT visit_count FROM statistics WHERE site_name = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $site_name); // 绑定网站名称
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$current_views = $row['visit_count'] ?? 0; // 如果没有找到,默认值为 0
// 关闭连接
$stmt->close();
$conn->close();
?>
<br>当前浏览次数: <?php echo htmlspecialchars($current_views); ?>
然后你只需要在需要的地方引用counter.php
即可。下面依然以final主题为示例:
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<footer style="margin:50px 0px">
<span id="footer-directive">
<?php $this->options->addfoot() ?>
</span>
<span>
© 2024 <a href="<?php $this->options->siteUrl(); ?>"><?php $this->options->title(); ?></a>
</span>
<?php include 'counter.php'; ?>
</footer>
</body>
</html>
然后就可以实现类似卜蒜子一样的统计效果了。而且没有使用到JS,不会被去广告插件拦截。
其它
如果你有兴趣可以自己动手实现一下。你也可以把数据库信息替换成typecho的数据库信息,这样就避免了新操作一个数据库的逻辑,并且可以实现使用typecho的Db.php
文件操作数据库。下面给一个简单的示例,具体的实现逻辑和读写权限请自行斟酌完成。
<?php
// 引入 Typecho 的数据库类
require_once '/www/wwwroot/banzhuanriji.com/usr/Typecho/Db.php'; // 确保路径正确
// 获取数据库连接
$db = Typecho_Db::get();
// 指定网站名称
$site_name = 'example.com'; // 这里修改为需要统计的网站名称
try {
// 更新特定网站的浏览次数
$db->query("UPDATE `statistics` SET `visit_count` = `visit_count` + 1 WHERE `site_name` = ?", $site_name);
// 获取当前浏览次数
$result = $db->fetchRow($db->select('visit_count')->from('statistics')->where('site_name = ?', $site_name));
$current_views = $result['visit_count'];
} catch (Exception $e) {
// 处理异常
error_log($e->getMessage());
$current_views = 0; // 如果出错,设置为 0
}
?>
<div class="counter">
<h1><?php echo htmlspecialchars($site_name); ?> 当前浏览次数: <?php echo htmlspecialchars($current_views); ?></h1>
</div>