系統資料庫設計
userinfo 表 - 使用者主檔
CREATE TABLE userinfo (
Name VARCHAR(20) NOT NULL PRIMARY KEY, -- 登入帳號,唯一
Password VARCHAR(32) NOT NULL, -- MD5 加密密碼
NickName VARCHAR(20) NOT NULL, -- 顯示暱稱
Face VARCHAR(2) NOT NULL, -- 頭像編號 01~99
OnlineStatus TINYINT(1) DEFAULT 0, -- 1=線上, 0=離線
CurrentDate INT(11) DEFAULT 0, -- 最後活躍 UNIX 時間戳
EnterTimes INT(11) DEFAULT 0 -- 累計登入次數
);
forumtalk 表 - 訊息記錄
CREATE TABLE forumtalk (
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
sender VARCHAR(20) NOT NULL,
receiver VARCHAR(20) NOT NULL,
date INT(11) DEFAULT 0 NOT NULL,
readsign TINYINT(4) DEFAULT 0 NOT NULL,
body VARCHAR(200) NOT NULL,
KEY idx_receiver_readsign (receiver, readsign)
);
線上用戶列表顯示邏輯
<?php
// 查詢 2 分鐘內有活動且 OnlineStatus=1 的用戶
$sql = "SELECT Name, NickName, Face, EnterTimes
FROM userinfo
WHERE OnlineStatus=1 AND CurrentDate > " . (time() - 120);
$result = mysql_query($sql);
$onlineCount = mysql_num_rows($result);
echo "歡迎光臨,共有 {$onlineCount} 位朋友在線,點擊頭像發送短訊息:
";
for ($i = 0; $i < $onlineCount; $i++) {
$user = mysql_fetch_array($result);
if (!$user) break;
$faceUrl = "/images/face/{$user['Face']}.gif";
$border = ($name == $user['Name']) ? 'border=1' : '';
$title = "代號:{$user['Name']} 暱稱:{$user['NickName']} 來訪:{$user['EnterTimes']}";
echo "<img src='{$faceUrl}' width=20 height=20 {$border} title='{$title}' ";
echo "onclick=\"window.open('shortalk.php?action=send&to={$user['Name']}', 'sendmsg', 'width=400,height=300')\"> ";
}
?>
關鍵設計細節
- 頭像編號:儲存兩位數字字串(
01~99),前端自動組合 /images/face/01.gif,易於擴充。
- 線上判定:
CurrentDate > NOW()-120 配合 OnlineStatus=1 雙重保險,避免異常斷線殘留。
- 自我識別:目前登入者頭像加
border=1 高亮。
- 點擊發訊:
onclick 彈出 shortalk.php 視窗,傳遞目標帳號 to=...。
登入/註冊流程補充
- 註冊:檢查
Name 唯一 → Password=MD5($pwd) → 寫入 userinfo,OnlineStatus=0、CurrentDate=0、EnterTimes=0。
- 登入:驗證
MD5($pwd) == Password → 更新 OnlineStatus=1、CurrentDate=NOW()、EnterTimes++ → 寫入 Session $_SESSION['name']。
- 登出:更新
OnlineStatus=0 → 銷毀 Session。
安全性待改善項目
- 密碼採用 MD5 無鹽值,建議改用
password_hash()/password_verify()。
- SQL 直接拼接變數,須改用預備語句。
- Session 啟動需在輸出前,並設定
session.cookie_httponly=1、session.use_strict_mode=1。