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

模擬 OICQ 系統核心程式解析(一):使用者註冊、登入與線上列表

     編輯:PHP 相關知識

系統資料庫設計

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=...。

登入/註冊流程補充

  1. 註冊:檢查 Name 唯一 → Password=MD5($pwd) → 寫入 userinfo,OnlineStatus=0、CurrentDate=0、EnterTimes=0。
  2. 登入:驗證 MD5($pwd) == Password → 更新 OnlineStatus=1、CurrentDate=NOW()、EnterTimes++ → 寫入 Session $_SESSION['name']。
  3. 登出:更新 OnlineStatus=0 → 銷毀 Session。

安全性待改善項目

  • 密碼採用 MD5 無鹽值,建議改用 password_hash()/password_verify()。
  • SQL 直接拼接變數,須改用預備語句。
  • Session 啟動需在輸出前,並設定 session.cookie_httponly=1、session.use_strict_mode=1。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved