在開發網站時,頁面計數器是常見的功能需求。然而,若不加限制,使用者只需不斷重新整理頁面,就能人為虛增瀏覽次數。本文將示範如何使用 PHP 搭配 Session 機制,打造一個能有效防止重複計數的簡易計數器。
程式的關鍵在於利用 $_SESSION['counter'] 標記該瀏覽器是否已在當前會話中計數過。當使用者首次造訪頁面時,Session 尚無此標記,程式會將資料庫中的計數值加一,並寫入 Session 標記;若同一瀏覽器再次重新整理頁面,偵測到 Session 已存在,便不再更新資料庫,達到防刷新效果。
<?php
require_once('config.php');
function counter() {
session_start();
$sql = "SELECT counter FROM counter";
$result = @mysql_query($sql);
if (!empty($result)) {
$row = mysql_fetch_array($result);
$counter = ++$row['counter'];
// 檢查 Session 是否已計數
if (!$_SESSION['counter']) {
$query = "UPDATE counter SET counter = $counter";
$result = @mysql_query($query);
if ($result) {
$_SESSION['counter'] = true; // 設定標記,防止重複計數
}
}
// 以圖片方式顯示數字
$counter_len = strlen($counter);
for ($i = 0; $i < $counter_len; $i++) {
$number = substr($counter, $i, 1);
if (isset($number)) {
echo "<img src='image/{$number}.gif'>";
}
}
}
}
?>
counter 資料表,包含 counter 整數欄位,初始值為 0。image/ 目錄下。本範例使用已棄用的 mysql_* 函式,實際部署建議改用 PDO 或 MySQLi 並採用預處理語句,防範 SQL 注入。此外,高流量網站應考慮使用 Redis 或 Memcached 等記憶體存儲替代資料庫,大幅降低 I/O 壓力。
透過 Session 機制搭配資料庫儲存,即可輕鬆實作具備基本防刷功能的頁面計數器。此架構簡單易懂,適合中小型專案快速導入,亦可作為進階計數系統的基礎雛形。