聊天室是學習 PHP + MySQL 互動開發的經典入門專案。本文以簡單、可運行的程式碼示範核心流程:使用框架分隔輸入區與顯示區、Meta Refresh 定時輪詢、資料庫自動清理舊訊息。雖然現代專案多採用 WebSocket/長輪詢,但此架構邏輯清晰,適合理解基礎原理。
CREATE TABLE `chat` (
`chtime` DATETIME NOT NULL,
`nick` CHAR(10) NOT NULL,
`words` VARCHAR(150) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<form action="main.php" method="post">
暱稱:<input type="text" name="nick" required>
<input type="submit" value="進入聊天室">
</form>
<?php
setcookie('nick', $_POST['nick'] ?? '', time()+3600);
?>
<frameset rows="80%,*">
<frame src="cdisplay.php" name="chatdisplay">
<frame src="speak.php" name="speak">
</frameset>
<?php
$link = mysqli_connect('localhost', 'root', '', 'chat_db');
mysqli_set_charset($link, 'utf8mb4');
$res = mysqli_query($link, "SELECT * FROM `chat` ORDER BY `chtime`");
$rows = mysqli_num_rows($res);
$show = min(15, $rows);
if ($rows > 0) {
mysqli_data_seek($res, $rows - $show);
while ($row = mysqli_fetch_assoc($res)) {
echo htmlspecialchars($row['chtime']) . ' ';
echo '<strong>' . htmlspecialchars($row['nick']) . '</strong>: ';
echo htmlspecialchars($row['words']) . '<br>';
}
}
// 只保留最新 20 筆,刪除更舊資料
if ($rows > 20) {
mysqli_data_seek($res, $rows - 20);
$old = mysqli_fetch_assoc($res);
mysqli_query($link, "DELETE FROM `chat` WHERE `chtime` < '" . $old['chtime'] . "'");
}
mysqli_close($link);
?>
<meta http-equiv="refresh" content="5;url=cdisplay.php">
<?php
if (!empty($_POST['words'])) {
$link = mysqli_connect('localhost', 'root', '', 'chat_db');
$nick = $_COOKIE['nick'] ?? '匿名';
$words = mysqli_real_escape_string($link, $_POST['words']);
$time = date('Y-m-d H:i:s');
mysqli_query($link, "INSERT INTO `chat` (`chtime`,`nick`,`words`) VALUES ('$time','$nick','$words')");
mysqli_close($link);
}
?>
<form method="post">
<input type="text" name="words" placeholder="輸入發言..." required>
<input type="submit" value="發言">
</form>
htmlspecialchars()。確保 PHP 啟用 mysqli 擴充,資料庫連線資訊請改用環境變數或獨立設定檔,勿硬編碼於程式碼中。