php实现简单留言板
创建数据库表结构
留言板需要存储用户提交的信息,通常包含ID、用户名、留言内容、时间等字段。MySQL示例:
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
建立数据库连接
使用PDO连接MySQL数据库,确保安全性:
$dbHost = 'localhost';
$dbName = 'message_board';
$dbUser = 'root';
$dbPass = '';
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Database connection failed: " . $e->getMessage());
}
处理表单提交
创建HTML表单并处理POST请求:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = htmlspecialchars($_POST['username']);
$content = htmlspecialchars($_POST['content']);
$stmt = $pdo->prepare("INSERT INTO messages (username, content) VALUES (?, ?)");
$stmt->execute([$username, $content]);
header("Location: ".$_SERVER['PHP_SELF']);
exit();
}
显示留言列表
从数据库检索并显示所有留言:
$stmt = $pdo->query("SELECT * FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($messages as $message) {
echo "<div class='message'>";
echo "<h3>{$message['username']}</h3>";
echo "<p>{$message['content']}</p>";
echo "<small>".date('Y-m-d H:i', strtotime($message['created_at']))."</small>";
echo "</div>";
}
前端界面设计
基础HTML表单和样式示例:
<form method="POST">
<input type="text" name="username" placeholder="Your name" required>
<textarea name="content" placeholder="Your message" required></textarea>
<button type="submit">Submit</button>
</form>
<style>
.message {
border: 1px solid #ddd;
padding: 15px;
margin-bottom: 10px;
}
textarea {
width: 100%;
min-height: 100px;
}
</style>
安全增强措施
添加基础防护:
// 防止XSS
function sanitize($data) {
return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8');
}
// 防止CSRF
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('Invalid CSRF token');
}
}
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
分页功能实现
添加留言分页支持:
$perPage = 5;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$total = $pdo->query("SELECT COUNT(*) FROM messages")->fetchColumn();
$totalPages = ceil($total / $perPage);
$stmt = $pdo->prepare("SELECT * FROM messages ORDER BY created_at DESC LIMIT ? OFFSET ?");
$stmt->bindValue(1, $perPage, PDO::PARAM_INT);
$stmt->bindValue(2, $offset, PDO::PARAM_INT);
$stmt->execute();
文件结构建议
推荐的项目结构:
/message-board
├── index.php # 主界面
├── config.php # 数据库配置
├── functions.php # 公共函数
├── styles.css # 样式表
└── /includes # 包含文件
├── header.php
└── footer.php






