三文件極簡架構:
commentform.html:提交表單commentadd.php:處理入庫comments.php:顯示列表CREATE TABLE `comtbl` (
`postID` INT NOT NULL AUTO_INCREMENT,
`postTITLE` TEXT NOT NULL,
`posterNAME` TEXT NOT NULL,
`posterEMAIL` TEXT NOT NULL,
`postTIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`postTXT` TEXT NOT NULL,
PRIMARY KEY (`postID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
comments.php<?php
// 資料庫連線(實際應用建議用 PDO/mysqli 預處理)
$dbcnx = mysql_connect('localhost', 'username', 'password');
mysql_select_db('comments', $dbcnx);
$result = mysql_query("SELECT * FROM comtbl ORDER BY postID DESC");
if (!$result) {
die('<b>查詢失敗: ' . mysql_error() . '</b>');
}
while ($row = mysql_fetch_array($result)) {
$msgTxt = $row['postTXT'];
$msgId = $row['postID'];
$SigName = $row['posterNAME'];
$SigDate = $row['postTIME'];
$msgTitle = $row['postTITLE'];
$url = $row['posterEMAIL'];
// TIMESTAMP 格式:YYYYMMDDHHMMSS
$yr = substr($SigDate, 2, 2);
$mo = substr($SigDate, 4, 2);
$da = substr($SigDate, 6, 2);
$hr = substr($SigDate, 8, 2);
$min = substr($SigDate, 10, 2);
// 12/24 小時制轉換
if ($hr > 11) {
$x = 12;
$timetype = 'PM';
$hr = $hr - 12;
} else {
$timetype = 'AM';
}
// Email 連結處理
if (!$url) {
$url = '#';
} else {
$stat = $url;
$url = 'mailto:' . $url;
}
// 輸出 HTML(建議使用模板引擎分離)
echo "<div class='comment'>";
echo "<h4>$msgTitle</h4>";
echo "<p>$msgTxt</p>";
echo "<small>由 <a href='$url'>$SigName</a> 於 $yr-$mo-$da $hr:$min $timetype 發表</small>";
echo "</div>";
}
?>
commentform.html<form action="commentadd.php" method="post">
<p>標題:<input type="text" name="title" required></p>
<p>姓名:<input type="text" name="name" required></p>
<p>Email:<input type="email" name="email"></p>
<p>內容:<textarea name="content" rows="5" required></textarea></p>
<p><input type="submit" value="發表評論"></p>
</form>
commentadd.php<?php
$dbcnx = mysql_connect('localhost', 'username', 'password');
mysql_select_db('comments', $dbcnx);
$title = mysql_real_escape_string($_POST['title']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$txt = mysql_real_escape_string($_POST['content']);
$sql = "INSERT INTO comtbl (postTITLE, posterNAME, posterEMAIL, postTXT)
VALUES ('$title', '$name', '$email', '$txt')";
if (mysql_query($sql)) {
header('Location: comments.php');
} else {
die('發表失敗: ' . mysql_error());
}
?>
mysqli 或 PDO 並使用預處理語句strip_tags 或 HTMLPurifier)、XSS 防護LIMIT 分頁,避免一次性載入過多DATE_FORMAT() 在 SQL 層格式化,或 PHP DateTime 物件操作,勿手動解析 TIMESTAMP 字串mailto: 導致爬蟲收集,可改用聯繫表單或 JS 動態生成