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

PHP 分頁留言板:文字檔儲存與表情符號支援完整實作

     編輯:PHP 綜合知識

專案特色

一個純文字檔儲存的 PHP 留言板,支援分頁顯示、表情符號選擇、HTML 防注入、自動截取最新 100 筆留言。無需資料庫即可部署,適合虛擬主機或靜態空間環境。

系統設定區塊

$guestfile = "guest";      // 留言資料檔
$home = "index.html";      // 返回首頁連結
$imagedir = "image";       // 表情圖片目錄
$backimage = $imagedir."/bk.gif";  // 背景圖
$backcolor = "#ceffff";    // 背景色(無圖時)

核心功能模組解析

1. 分頁參數處理

if($QUERY_STRING != "") { $page = $QUERY_STRING; }
else { $page = 1; }

直接使用 $QUERY_STRING 作為頁碼參數(如 guest.php?2 代表第 2 頁),簡單但缺乏參數名稱語意。

2. 新增留言處理 ($mode == "add")

$name = htmlspecialchars(trim($name));
$title = htmlspecialchars(trim($title));
$data = nl2br(htmlspecialchars($data));
$data = str_replace("\r","",$data);
$data = str_replace("\x0A","",$data);
$data = str_replace(" "," ",$data);
if($data=="") $data=" ";

$e_mail = trim($e_mail); if($e_mail=="") $e_mail=0;
$url = trim($url); if($url=="https://" || $url=="") $url=0;

$time = date("Y")."年".date("m")."月".date("d")."日[".date("H").":".date("i").":".date("s")."]";

if($name=="" || $title==""){
    echo "";
    exit;
}

$adddata = $name."\t".$e_mail."\t".$url."\t".$title."\t".$data."\t".$icon."\t".$time."\n";
  • 輸入淨化:htmlspecialchars 防 XSS、nl2br 換行轉 <br>、移除控制字元
  • 欄位分隔:使用 Tab (\t) 分隔 7 個欄位,最後以換行符結束
  • 必填驗證:姓名與標題不可為空,失敗彈窗並返回

3. 文字檔寫入與截取邏輯

if(file_exists($guestfile)){
    $filebuffer = file($guestfile);
    if(sizeof($filebuffer) > 100){
        for($i=0; $i<100; $i++) $newbuffer[$i] = $filebuffer[$i];
    } else {
        $newbuffer = $filebuffer;
    }
    $fp = fopen($guestfile,"w");
    fputs($fp,$adddata);
    fclose($fp);
    $buffer = implode("",$newbuffer);
    $fp = fopen($guestfile,"a");
    fputs($fp,$buffer);
    fclose($fp);
} else {
    $fp = fopen($guestfile,"w");
    fwrite($fp,$adddata);
    fclose($fp);
}

關鍵機制:新留言永遠插入檔案最前端(最新優先),舊資料向後推,超過 100 筆截斷舊資料。但此寫法存在競態條件,併發寫入會導致資料遺失。

4. 表情符號選擇介面

<input type="radio" name="icon" value="1"> 
<img src="<? echo $imagedir."/1.gif"; ?>" width="15" height="15">
<input type="radio" name="icon" value="2"> 
<img src="<? echo $imagedir."/2.gif"; ?>" width="15" height="15"> ...

提供 5 組單選按鈕搭配圖片預覽,預設選擇第 4 組。儲存時記錄 icon 值,顯示時對應輸出圖片。

5. 顯示邏輯(程式碼截斷,推測實作)

原始碼於顯示部分中斷,但根據資料結構可推測:

  1. 讀取 $guestfile 全部內容
  2. 以 \t 分割各欄位
  3. 根據 $page 計算分頁範圍
  4. 迴圈輸出 HTML 表格:姓名、時間、標題、內容、表情圖片
  5. 產生分頁導航連結

資料結構定義

# guest 檔案格式(每行一筆,Tab 分隔)
姓名	Email	網址	標題	內容	表情代碼	時間
張三	test@ex.com	https://blog.com	測試標題	留言內容
換行 3 2024年01月15日[14:30:25]

安全性與功能缺陷分析

嚴重度問題影響修正方案
🔴 嚴重無檔案鎖定併發寫入資料遺失/損毀flock() / 遷移 SQLite
🟠 高QUERY_STRING 直接作頁碼非數字輸入導致錯誤、安全風險intval($_GET['page']) 驗證
🟠 高Tab 分隔符衝突留言含 Tab 導致欄位錯位JSON 序列化 / Base64 編碼
🟡 中nl2br + htmlspecialchars 順序先 nl2br 再 htmlspecialchars 會雙重編碼 <br>先 htmlspecialchars 再 nl2br
🟡 中無 CSRF Token可被偽造跨站提交Session Token 驗證
🟢 低日期格式硬編碼難以國際化、排序儲存 Unix timestamp

現代化重構關鍵點

<?php
// 使用 JSON Lines 格式儲存,避免分隔符衝突
$entry = [
    'name' => htmlspecialchars(trim($_POST['name'])),
    'email' => filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ?: null,
    'url' => filter_var($_POST['url'], FILTER_VALIDATE_URL) ?: null,
    'title' => htmlspecialchars(trim($_POST['title'])),
    'content' => nl2br(htmlspecialchars($_POST['content'])),
    'icon' => intval($_POST['icon']),
    'time' => time(),  // Unix timestamp
];

// 原子寫入:臨時檔 + rename
$tmp = $guestfile . '.tmp.' . uniqid();
file_put_contents($tmp, json_encode($entry, JSON_UNESCAPED_UNICODE) . "\n" 
    . file_get_contents($guestfile), LOCK_EX);
rename($tmp, $guestfile);

// 讀取與分頁
$lines = file($guestfile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$total = count($lines);
$perPage = 20;
$page = max(1, intval($_GET['page'] ?? 1));
$offset = ($page - 1) * $perPage;
$pageData = array_slice($lines, $offset, $perPage);

foreach($pageData as $line) {
    $entry = json_decode($line, true);
    // 輸出 HTML...
}
?>

功能擴充建議

  • 管理後台:刪除/編輯留言、封鎖 IP、關鍵字過濾
  • 回覆功能:巢狀留言結構、引用通知
  • 驗證碼:reCAPTCHA v3 / 算術題防機器人
  • RSS/Atom 訂閱:最新留言餵送
  • 搜尋功能:關鍵字全文檢索
  • 資料匯出:CSV/JSON 備份下載

這個留言板展示了「文字檔即資料庫」的極簡實作哲學,適合無資料庫權限的虛擬主機環境。分頁、表情、防注入、自動截取等功能俱全,邏輯清晰易懂。但生產部署前務必解決並發安全與分隔符衝突問題,建議遷移至 JSON Lines + flock 或 SQLite,並補強 CSRF、驗證碼等防護機制。

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