一个简单的PHP统计脚本

你在本网站的每个页面页脚处会看到当前页面被访问次数。这个实现方案其实很简单。我之前做过一个全站的访问次数显示。每次刷新页面访问次数都会+1。

昨天修改了一下,现在会分别统计每个页面的访问次数。

<?php
// 获取当前页面路径
// 使用 $_SERVER["REQUEST_URI"] 获取完整的请求 URI
// strtok() 用于移除查询参数(例如 ?id=123),以确保 /post/1 和 /post/1?ref=xyz 被视为同一个页面
$current_path = strtok($_SERVER["REQUEST_URI"], '?');

// 数据库配置 (请根据您的实际环境修改)
$servername = "localhost";
$username = "数据库用户名";
$password = "数据库密码";
$dbname = "数据库名";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname, 3306);

// 检查连接
if ($conn->connect_error) {
    // 记录错误,但不对用户显示敏感信息,也不中断页面加载
    error_log("Database connection failed: " . $conn->connect_error);
    // 可选:显示一个友好的提示,但我们尽量保持沉默
    echo "<span style='color:red;'>[统计服务连接失败]</span>";
    return; // 退出脚本,避免后续错误
}

$current_views = 0;

try {
    // --- 步骤 1: 记录并更新访问量 ---
    // 使用 INSERT ... ON DUPLICATE KEY UPDATE: 
    // 尝试插入新路径,如果 page_path 已存在 (DUPLICATE KEY),则执行 UPDATE 操作,将 visit_count + 1
    $sql_update = "
        INSERT INTO page_statistics (page_path, visit_count)
        VALUES (?, 1)
        ON DUPLICATE KEY UPDATE visit_count = visit_count + 1
    ";

    $stmt_update = $conn->prepare($sql_update);
    // 's' 表示绑定变量类型为 string
    $stmt_update->bind_param("s", $current_path); 
    $stmt_update->execute();
    $stmt_update->close();

    // --- 步骤 2: 获取最新的访问量 ---
    $sql_select = "SELECT visit_count FROM page_statistics WHERE page_path = ?";
    $stmt_select = $conn->prepare($sql_select);
    $stmt_select->bind_param("s", $current_path); 
    $stmt_select->execute();
    
    $result = $stmt_select->get_result();

    if ($row = $result->fetch_assoc()) {
        $current_views = $row['visit_count'];
    }

    $stmt_select->close();

} catch (Exception $e) {
    error_log("Page counter error: " . $e->getMessage());
    $current_views = '错误';
}

// 关闭连接
$conn->close();
?>

<!-- HTML 输出部分 -->
<p class="textwp-copyright">
当前页面浏览次数: <?php echo htmlspecialchars($current_views); ?>
</p>

使用之前需要新建表,可是使用下面的语句

-- 建议使用新表名 page_statistics 以区分按路径统计
CREATE TABLE page_statistics (
    id INT AUTO_INCREMENT PRIMARY KEY,
    -- 存储完整的页面路径,例如:/post/my-article-title
    page_path VARCHAR(500) NOT NULL UNIQUE,
    visit_count BIGINT NOT NULL DEFAULT 0,
    -- 为 page_path 添加索引以加快查询速度
    INDEX (page_path)
);

使用的时候,你希望它在哪里显示,直接加上下面的代码就可以了

<?php include 'counter.php'; ?>

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注