早期 PHP 靜態頁生成系統範例:表單提交文章存入 MySQL,讀取模板檔案替換變數,產出靜態 HTML 檔案。本文整理核心流程、資料表設計、模板替換邏輯、計數器機制,並指出現代化改進方向。
CREATE TABLE wenzhang (
id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
timu VARCHAR(200) NOT NULL, -- 標題
zuozhe VARCHAR(18) NOT NULL, -- 作者
laiyuan VARCHAR(40) NOT NULL, -- 來源
textt TEXT NOT NULL, -- 內容
riqi DATETIME NOT NULL, -- 日期
PRIMARY KEY (id)
);
<?php
$db = mysql_connect('localhost', 'root');
mysql_select_db('study', $db);
// 1. 寫入資料庫 (注意:實際應用必須用預備陳述式防注入)
$t = date('Y-m-d H:i:s');
$sql = "INSERT INTO wenzhang (timu, zuozhe, laiyuan, textt, riqi)
VALUES ('$timu', '$zuozhe', '$laiyuan', '$textt', '$t')";
mysql_query($sql);
// 2. 計數器 (檔案鎖定機制缺失,併發下會丟失)
$count = (int)file_get_contents('count.txt') + 1;
file_put_contents('count.txt', $count);
// 3. 讀取三段模板
$tpl1 = file_get_contents('muoban1.txt'); // HTML 頭部 + 標題位置
$tpl2 = file_get_contents('muoban2.txt'); // 內容區塊前綴
$tpl3 = file_get_contents('muoban3.txt'); // HTML 尾部
// 4. 組合中繼資訊
$meta = "<br>作者:<font color='#306800'>$zuozhe</font>
來源:<font color='#306800'>$laiyuan</font>
時間:<font color='#336600'>$t</font><br>";
// 5. 產出最終內容
$content = $tpl1 . $timu . $meta . $tpl2 . $textt . $tpl3;
// 6. 寫入靜態檔案 (檔名: 計數器.html)
$filename = $count . '.html';
file_put_contents($filename, $content);
echo "<center><b>提交成功</b></center>";
?>
muoban1.txt:<html><head>...</head><body><h1> (標題插入點)muoban2.txt:</h1><div class='content'> (內容前綴)muoban3.txt:</div></body></html>| 問題 | 風險 | 現代解決方案 |
|---|---|---|
| mysql_* 函數 | 已移除 (PHP 7+) | PDO / MySQLi + 預備陳述式 |
| SQL 直接拼接變數 | SQL 注入 | 參數綁定 $stmt->execute([$timu, $zuozhe, ...]) |
| 計數器檔案無鎖 | 併發丟號/重複 | 資料庫 AUTO_INCREMENT / Redis INCR |
| 模板簡單字串拼接 | 難維護、易 XSS | Twig / Blade / Latte 模板引擎 (自動轉義) |
| 靜態檔案直接寫入 Web 目錄 | 權限、部署、快取問題 | 生成至獨立目錄,Nginx 靜態服務 + CDN |
| 無分頁、無分類、無搜尋 | 功能極簡 | 引入框架 (Laravel/Symfony) 或 CMS (WordPress/Typecho) |
Sculpin, Jigsaw, StatieHexo, VuePress, Next.js (SSG)Hugo (極快)Pelican, MkDocs此範例展示了「資料 + 模板 = 靜態頁」的核心思想,現代工具將此流程標準化、工程化、高效能化。