当前位置:首页 > PHP

php实现评论功能

2026-01-15 12:59:05PHP

数据库设计

创建评论表(示例结构):

CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `content` text NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `parent_id` int(11) DEFAULT NULL COMMENT '回复的评论ID',
  `post_id` int(11) NOT NULL COMMENT '关联的文章或内容ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

表单提交处理

创建评论提交表单(HTML部分):

<form action="submit_comment.php" method="POST">
  <input type="hidden" name="post_id" value="<?php echo $post_id; ?>">
  <textarea name="content" required></textarea>
  <button type="submit">提交评论</button>
</form>

PHP处理逻辑(submit_comment.php):

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $content = htmlspecialchars($_POST['content']);
  $post_id = intval($_POST['post_id']);
  $user_id = $_SESSION['user_id'] ?? 0; // 假设用户已登录

  $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
  $stmt = $pdo->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 = intval($_GET['id']);
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->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>用户ID: '.$comment['user_id'].' | 时间: '.$comment['created_at'].'</small>';
  echo '</div>';
}
?>

回复功能实现

扩展表单支持回复:

<form action="submit_comment.php" method="POST">
  <input type="hidden" name="post_id" value="<?php echo $post_id; ?>">
  <input type="hidden" name="parent_id" value="<?php echo $_GET['reply_to'] ?? 0; ?>">
  <textarea name="content" required></textarea>
  <button type="submit">提交</button>
</form>

更新数据库插入逻辑:

$parent_id = isset($_POST['parent_id']) ? intval($_POST['parent_id']) : null;
$stmt = $pdo->prepare("INSERT INTO comments (user_id, content, post_id, parent_id) VALUES (?, ?, ?, ?)");
$stmt->execute([$user_id, $content, $post_id, $parent_id]);

嵌套评论展示

递归显示评论及回复:

function displayComments($comments, $parent_id = null) {
  foreach ($comments as $comment) {
    if ($comment['parent_id'] == $parent_id) {
      echo '<div class="comment" style="margin-left: '.($parent_id ? '20px' : '0').'">';
      echo '<p>'.htmlspecialchars($comment['content']).'</p>';
      echo '<a href="?id='.$comment['post_id'].'&reply_to='.$comment['id'].'">回复</a>';
      displayComments($comments, $comment['id']); // 递归调用
      echo '</div>';
    }
  }
}
displayComments($comments);

安全注意事项

  1. 始终使用预处理语句防止SQL注入
  2. 输出内容时使用htmlspecialchars()过滤XSS攻击
  3. 验证用户权限,确保登录后才能评论
  4. 对高频提交实施限流措施

性能优化建议

  1. post_idparent_id字段添加索引
  2. 实现分页查询避免一次性加载大量评论
  3. 考虑使用缓存机制存储热门帖子的评论

完整实现需根据实际项目需求调整数据库结构和业务逻辑。

php实现评论功能

标签: 功能php
分享给朋友:

相关文章

vue实现考试多选功能

vue实现考试多选功能

实现考试多选功能的方法 数据绑定与选项渲染 使用v-model绑定用户选择的答案数组,配合v-for渲染选项列表: <template> <div v-for="(op…

前端实现拖拽功能vue

前端实现拖拽功能vue

实现拖拽功能的基本方法 在Vue中实现拖拽功能可以通过HTML5的拖放API或第三方库如vuedraggable来完成。HTML5的拖放API提供了原生支持,而vuedraggable则简化了列表拖拽…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue电影功能实现

vue电影功能实现

Vue电影功能实现 数据获取与展示 使用Axios或Fetch API从电影API获取数据,例如TMDB或豆瓣API。在Vue组件的created或mounted生命周期钩子中发起请求,将返回的电影数…

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或…

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('lo…