php评论功能实现代码
数据库设计
创建一个评论表存储评论数据,表结构可包含以下字段:
id:评论唯一标识,主键自增content:评论内容,TEXT类型user_id:用户ID,关联用户表article_id:文章ID,关联文章表created_at:评论创建时间,TIMESTAMP类型
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
user_id INT NOT NULL,
article_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (article_id) REFERENCES articles(id)
);
评论表单
创建前端表单提交评论内容,需包含CSRF防护:

<form action="submit_comment.php" method="post">
<input type="hidden" name="article_id" value="<?php echo $article_id; ?>">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<textarea name="content" required></textarea>
<button type="submit">提交评论</button>
</form>
评论提交处理
创建PHP文件处理表单提交:
// submit_comment.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 验证CSRF令牌
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF token验证失败');
}
// 过滤和验证输入
$content = htmlspecialchars(trim($_POST['content']));
$article_id = filter_input(INPUT_POST, 'article_id', FILTER_VALIDATE_INT);
$user_id = $_SESSION['user_id'] ?? null;
if (empty($content) || !$article_id || !$user_id) {
die('参数不完整');
}
// 数据库连接
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 插入评论
$stmt = $db->prepare("INSERT INTO comments (content, user_id, article_id) VALUES (?, ?, ?)");
$stmt->execute([$content, $user_id, $article_id]);
// 重定向回原页面
header("Location: article.php?id=$article_id");
exit;
}
评论显示
在文章页面显示已有评论:

// article.php
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$article_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
// 获取评论
$stmt = $db->prepare("SELECT c.*, u.username FROM comments c
JOIN users u ON c.user_id = u.id
WHERE c.article_id = ?
ORDER BY c.created_at DESC");
$stmt->execute([$article_id]);
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 显示评论
foreach ($comments as $comment) {
echo '<div class="comment">';
echo '<strong>' . htmlspecialchars($comment['username']) . '</strong>';
echo '<p>' . htmlspecialchars($comment['content']) . '</p>';
echo '<small>' . $comment['created_at'] . '</small>';
echo '</div>';
}
安全增强
- 使用预处理语句防止SQL注入
- 对输出内容使用htmlspecialchars()转义
- 实现CSRF防护机制
- 添加用户权限验证(如登录状态检查)
- 对评论内容进行敏感词过滤
分页功能
对于大量评论可添加分页支持:
// 分页参数
$page = max(1, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT));
$per_page = 10;
$offset = ($page - 1) * $per_page;
// 获取分页评论
$stmt = $db->prepare("SELECT c.*, u.username FROM comments c
JOIN users u ON c.user_id = u.id
WHERE c.article_id = ?
ORDER BY c.created_at DESC
LIMIT ? OFFSET ?");
$stmt->bindValue(1, $article_id, PDO::PARAM_INT);
$stmt->bindValue(2, $per_page, PDO::PARAM_INT);
$stmt->bindValue(3, $offset, PDO::PARAM_INT);
$stmt->execute();
回复功能
如需实现评论回复功能,可扩展数据库表结构:
ALTER TABLE comments ADD COLUMN parent_id INT DEFAULT NULL;
ALTER TABLE comments ADD FOREIGN KEY (parent_id) REFERENCES comments(id);
然后在提交评论时处理parent_id参数,并修改显示逻辑实现嵌套展示。






