php评论实现过程
实现PHP评论功能的基本过程
数据库设计 创建数据库表存储评论信息,通常包含字段:评论ID、用户ID、内容、发布时间、关联文章ID等。示例SQL:
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
post_id INT,
FOREIGN KEY (post_id) REFERENCES posts(id)
);
表单提交处理 创建HTML表单供用户提交评论,通过POST方法提交到服务器:
<form method="POST" action="add_comment.php">
<textarea name="comment_content" required></textarea>
<input type="hidden" name="post_id" value="<?php echo $post_id; ?>">
<button type="submit">提交评论</button>
</form>
后端处理逻辑 在add_comment.php中处理表单提交:
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 获取表单数据
$content = $_POST['comment_content'];
$post_id = $_POST['post_id'];
$user_id = $_SESSION['user_id']; // 假设用户已登录
// 插入数据库
$stmt = $db->prepare("INSERT INTO comments (user_id, content, post_id) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $content, $post_id]);
// 重定向回文章页
header("Location: post.php?id=$post_id");
?>
评论显示功能 在文章页面查询并显示评论:
<?php
$post_id = $_GET['id'];
$stmt = $db->prepare("SELECT * FROM comments WHERE post_id = ? ORDER BY created_at DESC");
$stmt->execute([$post_id]);
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($comments as $comment) {
echo '<div class="comment">';
echo '<p>' . htmlspecialchars($comment['content']) . '</p>';
echo '<small>Posted on ' . $comment['created_at'] . '</small>';
echo '</div>';
}
?>
安全增强措施
输入验证 对所有用户输入进行过滤和验证:
$content = filter_input(INPUT_POST, 'comment_content', FILTER_SANITIZE_STRING);
if (empty($content)) {
die('评论内容不能为空');
}
防止XSS攻击 输出时使用htmlspecialchars转义HTML特殊字符:
echo htmlspecialchars($comment['content'], ENT_QUOTES, 'UTF-8');
CSRF防护 添加CSRF令牌到评论表单:
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
表单中加入隐藏字段:
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
高级功能实现
分页显示评论 实现评论分页查询:
$per_page = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $per_page;
$stmt = $db->prepare("SELECT * FROM comments WHERE post_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?");
$stmt->execute([$post_id, $per_page, $offset]);
回复功能 扩展数据库表添加parent_id字段:
ALTER TABLE comments ADD COLUMN parent_id INT DEFAULT NULL;
处理回复时存储父评论ID:
$parent_id = isset($_POST['parent_id']) ? (int)$_POST['parent_id'] : null;
$stmt = $db->prepare("INSERT INTO comments (user_id, content, post_id, parent_id) VALUES (?, ?, ?, ?)");
AJAX提交 使用jQuery实现无刷新评论提交:
$('#comment-form').submit(function(e) {
e.preventDefault();
$.post('add_comment.php', $(this).serialize(), function(response) {
$('#comments-container').append(response);
});
});






