当前位置:首页 > 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

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

vue实现收货功能

vue实现收货功能

Vue实现收货功能的基本思路 收货功能通常涉及前端界面交互、后端数据更新和状态管理。在Vue中,可以通过组件化开发实现这一功能,结合API调用与状态管理工具(如Vuex或Pinia)。 创建收货按钮…

php实现打印功能

php实现打印功能

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

php实现分页

php实现分页

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

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

vue实现答题功能

vue实现答题功能

Vue实现答题功能的基本思路 在Vue中实现答题功能通常需要以下几个核心模块:题目数据管理、用户交互处理、答题状态跟踪和结果计算。通过组件化开发可以更好地组织代码结构。 数据结构设计 答题功能的基…