資料表結構
CREATE TABLE useronline (
timestamp INT(15) DEFAULT 0 NOT NULL,
ip VARCHAR(40) NOT NULL,
file VARCHAR(100) NOT NULL,
PRIMARY KEY (timestamp),
KEY ip (ip),
KEY file (file)
);
核心邏輯流程
- 設定逾時秒數(如 300 秒)。
- 取得目前時間戳記
$timestamp = time()。
- 計算門檻
$timeout = $timestamp - $timeoutseconds。
- 連線資料庫。
- 插入當前訪客紀錄(IP、請求頁面、時間戳)。
- 刪除逾時紀錄
DELETE FROM useronline WHERE timestamp < $timeout。
- 查詢當前頁面不重複 IP 數
SELECT DISTINCT ip FROM useronline WHERE file = '...'。
- 統計行數
mysqli_num_rows() 即為線上人數。
- 關閉連線並輸出結果。
完整程式碼 (mysqli 版)
<?php
$server = 'localhost';
$db_user = 'root';
$db_pass = 'password';
$database = 'users';
$timeoutseconds = 300;
$timestamp = time();
$timeout = $timestamp - $timeoutseconds;
$conn = mysqli_connect($server, $db_user, $db_pass, $database);
if (!$conn) die('連線失敗');
// 插入訪客
$ip = mysqli_real_escape_string($conn, $_SERVER['REMOTE_ADDR']);
$file = mysqli_real_escape_string($conn, $_SERVER['PHP_SELF']);
$insert = mysqli_query($conn, "INSERT INTO useronline VALUES ($timestamp, '$ip', '$file')");
if (!$insert) echo 'Insert Failed';
// 清除逾時
$delete = mysqli_query($conn, "DELETE FROM useronline WHERE timestamp < $timeout");
if (!$delete) echo 'Delete Failed';
// 統計線上人數
$result = mysqli_query($conn, "SELECT DISTINCT ip FROM useronline WHERE file = '$file'");
if (!$result) echo 'Select Error';
$user = mysqli_num_rows($result);
mysqli_close($conn);
if ($user == 1) {
echo '1 user online';
} else {
echo "$user users online";
}
?>
安全性建議
- 使用
mysqli_real_escape_string() 或預處理語句防止 SQL 注入。
- 資料庫帳號務必設定強密碼。
- 考慮使用 Redis 或 Memcached 替代資料庫提升效能。