php评论功能实现
数据库设计
创建一个评论表存储评论数据,表结构可包含以下字段:
id:自增主键content:评论内容(TEXT类型)user_id:关联用户表的IDarticle_id:关联文章表的IDcreated_at:评论创建时间
SQL示例:
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)
);
表单提交处理
创建评论提交表单,前端HTML示例:
<form action="submit_comment.php" method="POST">
<input type="hidden" name="article_id" value="<?php echo $article_id; ?>">
<textarea name="content" required></textarea>
<button type="submit">提交评论</button>
</form>
后端处理脚本(submit_comment.php):
<?php
session_start();
require 'db_connection.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$content = htmlspecialchars($_POST['content']);
$article_id = intval($_POST['article_id']);
$user_id = $_SESSION['user_id']; // 假设用户已登录
$stmt = $pdo->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();
}
?>
评论显示实现
获取并显示评论的PHP代码:
<?php
$article_id = intval($_GET['id']);
$stmt = $pdo->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();
foreach ($comments as $comment) {
echo '<div class="comment">';
echo '<h4>'.htmlspecialchars($comment['username']).'</h4>';
echo '<p>'.nl2br(htmlspecialchars($comment['content'])).'</p>';
echo '<small>'.$comment['created_at'].'</small>';
echo '</div>';
}
?>
安全性增强措施
对评论内容进行过滤处理:
function sanitize_comment($input) {
$input = strip_tags($input); // 移除HTML标签
$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); // 转换特殊字符
return $input;
}
防止XSS攻击的HTML输出:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
分页功能实现
评论分页查询示例:

$per_page = 10;
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $per_page;
$stmt = $pdo->prepare("
SELECT SQL_CALC_FOUND_ROWS 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->execute([$article_id, $per_page, $offset]);
$comments = $stmt->fetchAll();
$total = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
$total_pages = ceil($total / $per_page);






