首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 計數器設計與實作(一):基本版、防刷版與圖形化版本完整代碼

     編輯:PHP 綜合知識

四種計數器模式比較

檔案類型特性
index.php基本版每請求 +1,不防刷
index1.php防刷版 (5秒)同 IP+User 5 秒內只算 1 次
index2.php防刷版 (2秒)同 IP+User 2 秒內只算 1 次
indexa.php綜合版基本+防刷+圖形顯示

核心資料表結構

CREATE TABLE `counter_1` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `user` VARCHAR(50) NOT NULL,
    `ip` VARCHAR(15) NOT NULL,
    `time` DATETIME NOT NULL
);

關鍵 SQL 技巧

防刷邏輯(5 秒範例)

$sql = "SELECT COUNT(*) FROM `counter_1` 
        WHERE user='$user' 
        AND TIME_TO_SEC(NOW() - `time`) < 5 
        AND ip='$REMOTE_ADDR'";

若查詢結果 > 0 表示在冷卻期內,不重複計數。

圖形化顯示數字

$count = $row[0]; // 總計數
$pic = '';
for ($i = 0; $i < strlen($count); $i++) {
    $digit = substr($count, $i, 1);
    $pic .= "<img src=\"timex/$digit.gif\" width=\"15\" height=\"20\">";
}
echo $pic;

需準備 timex/0.gif ~ 9.gif 十張數字圖片。

完整實作代碼(indexa.php 綜合版節錄)

<?php
//---[ 資料庫設定 ]---
$mysql_server = "localhost";
$mysql_user   = "root";
$mysql_pass   = "512783";
$mysql_db     = "jishuqi";

//---[ 連線 ]---
$conn = mysql_connect($mysql_server, $mysql_user, $mysql_pass);
mysql_select_db($mysql_db, $conn);

//---[ 寫入訪問記錄 ]---
$sql = "INSERT INTO `counter_1` (`user`, `ip`, `time`) VALUES ('$user', '$ip', NOW())";
mysql_query($sql, $conn);

//---[ 查詢總計數 ]---
$sql = "SELECT COUNT(*) FROM `counter_1`";
$result = mysql_db_query($mysql_db, $sql, $conn);
$row1 = mysql_fetch_row($result);
mysql_free_result($result);

//---[ 查詢當前用戶計數 ]---
$sql = "SELECT COUNT(*) FROM `counter_1` WHERE user='$user'";
$result = mysql_db_query($mysql_db, $sql, $conn);
$row2 = mysql_fetch_row($result);
mysql_free_result($result);
mysql_close($conn);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>綜合計數器</title>
<style>
.counter {font-size:24px; color:#00FF99;}
.num {font-size:36px; color:#996633;}
</style>
</head>
<body>
<div align="center" class="counter">楓樹林下</div>
<div align="center">
<p class="counter"><span style="color:#CC0033">總共有</span>
    <span class="num"><?=$row1[0]?></span>
    <span style="color:#FF0000">人</span>
    <span style="color:#0000FF">來過</span>
    <span style="color:#FF00FF">這個網站</span></p>
<p class="counter"><span style="color:#CC0033">您</span>
    <span class="num"><?=$row2[0]?></span>
    <span style="color:#FF0000">次造訪</span></p>
</div>
</body>
</html>

現代化改良建議

  • 棄用 mysql_*:改用 PDO 或 mysqli(支援預處理語句,防 SQL 注入)
  • Session/Redis 快取:高流量下避免每請求寫入 DB,用 Redis INCR + 定期持久化
  • 唯一訪客識別:結合 Cookie + IP + User-Agent,而非單純 IP
  • 圖形化輸出:改用 GD 動態生成圖片或 CSS Sprite,而非大量 <img> 標籤

PDO 版寫入範例

$pdo = new PDO("mysql:host=localhost;dbname=jishuqi;charset=utf8", "root", "512783");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("INSERT INTO counter_1 (user, ip, time) VALUES (?, ?, NOW())");
$stmt->execute([$user, $_SERVER['REMOTE_ADDR']]);

$total = $pdo->query("SELECT COUNT(*) FROM counter_1")->fetchColumn();
$userCount = $pdo->prepare("SELECT COUNT(*) FROM counter_1 WHERE user=?");
$userCount->execute([$user]);
$userTotal = $userCount->fetchColumn();

採用現代寫法可大幅提升安全性與效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved