虛擬主機常限制資料庫使用權限或額度,純文字檔方案零配置、零授權、備份即複製檔案,適合流量較小的個人站點或受限環境。本系列分上、下兩篇完整說明實作細節。
採用單一字元 & 作為欄位分隔,每筆留言以換行符結束。寫入前必須處理使用者輸入中可能包含的分隔符,建議轉換為 HTML 實體或自定義跳脫序列(如 #AMP#),讀出時再還原。
<?php
// 表單送出後處理
$nickname = str_replace('&', '#AMP#', $_POST['nickname']);
$email = str_replace('&', '#AMP#', $_POST['email']);
$content = str_replace('&', '#AMP#', $_POST['content']);
$content = str_replace("\n", '#BR#', $content); // 換行符同理處理
$record = "$nickname&$email&$content&" . date('Y-m-d H:i:s') . "\n";
// 附加寫入(最新留言在檔案末尾)
$fp = fopen('data/guestbook.txt', 'a');
fwrite($fp, $record);
fclose($fp);
?>
file() 將整檔讀入陣列,每行為一元素,索引 0 為最舊留言。利用 for 迴圈從陣列尾端遞減至 0,即可由新至舊輸出。
<?php
$lines = file('data/guestbook.txt');
$total = count($lines);
for ($i = $total - 1; $i >= 0; $i--) {
list($nick, $email, $content, $time) = explode('&', $lines[$i]);
// 還原跳脫字元
$nick = str_replace('#AMP#', '&', $nick);
$content = str_replace('#BR#', "<br>", $content);
$content = str_replace('#AMP#', '&', $content);
echo "<div class='msg'>";
echo "<strong>" . htmlspecialchars($nick) . "</strong> ";
echo "<span class='time'>$time</span><br>";
echo nl2br(htmlspecialchars($content));
echo "</div><hr>";
}
?>
htmlspecialchars() 防止 XSS 攻擊。644,目錄 755,避免任意寫入風險。下一篇將深入探討「編輯、刪除、管理回覆」等進階管理功能的文字檔實作細節。