php实现留言板功能
数据库设计
创建一个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数据库:
$host = 'localhost';
$dbname = 'message_board';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
提交留言处理
创建表单提交处理逻辑:
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>'.htmlspecialchars($message['username']).'</h3>';
echo '<p>'.nl2br(htmlspecialchars($message['content'])).'</p>';
echo '<small>'.date('Y-m-d H:i', strtotime($message['created_at'])).'</small>';
echo '</div>';
}
前端表单
创建HTML表单供用户提交留言:
<form method="post" action="">
<input type="text" name="username" placeholder="您的姓名" required>
<textarea name="content" placeholder="留言内容" required></textarea>
<button type="submit">提交留言</button>
</form>
安全增强
添加CSRF防护:

session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['token'], $_POST['token'])) {
die('CSRF验证失败');
}
// 继续处理表单
}
表单中添加隐藏的CSRF token字段:
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
分页功能
实现留言分页显示:
$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();
添加分页导航:
for ($i = 1; $i <= $totalPages; $i++) {
echo '<a href="?page='.$i.'">'.$i.'</a> ';
}






