>  기사  >  백엔드 개발  >  PHP는 지식 질문과 답변 웹사이트에 태그 클라우드와 주제 집계 기능을 구현합니다.

PHP는 지식 질문과 답변 웹사이트에 태그 클라우드와 주제 집계 기능을 구현합니다.

WBOY
WBOY원래의
2023-07-01 22:03:08807검색

PHP는 지식질문답 사이트에서 태그 클라우드와 주제 집계 기능을 구현합니다

지식 질문답변 웹사이트에서는 태그 클라우드와 주제 집계 기능이 두 가지 중요한 기능입니다. 태그 클라우드는 사용자가 웹사이트의 인기 주제와 공통 태그를 빠르게 이해하도록 도와줌으로써 사용자가 관련 질문과 답변을 더 쉽게 찾아보고 검색할 수 있도록 해줍니다. 주제 집계를 통해 동일한 태그로 질문과 답변을 그룹화할 수 있으므로 사용자가 보다 편리하게 보고 토론할 수 있습니다. 아래에서는 PHP를 사용하여 이 두 가지 기능을 구현하겠습니다.

먼저 질문, 답변, 태그 데이터를 저장할 데이터베이스를 만들어야 합니다. 질문, 답변, 태그라는 세 개의 테이블이 있는 "qa"라는 데이터베이스를 만들 수 있습니다.

질문 테이블의 구조는 다음과 같습니다.

CREATE TABLE `questions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT '',
  `content` text,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

답변 테이블은 다음과 같습니다.

CREATE TABLE `answers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `question_id` int(11) DEFAULT NULL,
  `content` text,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

tags 테이블은 다음과 같습니다.

CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

다음으로 질문 페이지와 답변 페이지에 태그 선택 상자를 추가해야 합니다. 지식 질문 및 답변 웹 사이트를 만들고 사용자가 선택한 태그를 질문 또는 답변과 연결합니다.

<!-- 提问页面 -->
<form action="post_question.php" method="post">
  <label for="title">问题标题:</label>
  <input type="text" name="title" id="title"><br>

  <label for="content">问题内容:</label>
  <textarea name="content" id="content"></textarea><br>

  <label for="tags">标签:</label>
  <select name="tags[]" id="tags" multiple>
    <option value="php">PHP</option>
    <option value="javascript">JavaScript</option>
    <option value="html">HTML</option>
    <!-- 其他标签选项 -->
  </select><br>

  <input type="submit" value="提交问题">
</form>

<!-- 回答页面 -->
<form action="post_answer.php" method="post">
  <label for="content">回答内容:</label>
  <textarea name="content" id="content"></textarea><br>

  <label for="tags">标签:</label>
  <select name="tags[]" id="tags" multiple>
    <option value="php">PHP</option>
    <option value="javascript">JavaScript</option>
    <option value="html">HTML</option>
    <!-- 其他标签选项 -->
  </select><br>

  <input type="submit" value="提交回答">
</form>

그런 다음 질문 또는 답변과 관련된 태그 데이터를 백그라운드 질문 제출 핸들러(post_question.php) 및 답변 제출 핸들러(post_answer.php)의 데이터베이스에 저장해야 합니다.

// post_question.php
// 获取用户提交的问题数据
$title = $_POST['title'];
$content = $_POST['content'];
$tags = $_POST['tags'];

// 插入问题数据到 questions 表中
// 获取最后插入的问题的id
$question_id = mysqli_insert_id($conn);

// 插入标签数据到 tags 表中
foreach ($tags as $tag) {
  $sql = "INSERT INTO tags (title) VALUES ('$tag')";
  mysqli_query($conn, $sql);
  
  // 获取最后插入的标签的id
  $tag_id = mysqli_insert_id($conn);
  
  // 插入问题和标签的关联到 question_tag 表中
  $sql = "INSERT INTO question_tag (question_id, tag_id) VALUES ($question_id, $tag_id)";
  mysqli_query($conn, $sql);
}

// post_answer.php
// 获取用户提交的回答数据
$content = $_POST['content'];
$tags = $_POST['tags'];

// 插入回答数据到 answers 表中
// 获取最后插入的回答的id
$answer_id = mysqli_insert_id($conn);

// 插入标签数据到 tags 表中
foreach ($tags as $tag) {
  $sql = "INSERT INTO tags (title) VALUES ('$tag')";
  mysqli_query($conn, $sql);
  
  // 获取最后插入的标签的id
  $tag_id = mysqli_insert_id($conn);
  
  // 插入回答和标签的关联到 answer_tag 表中
  $sql = "INSERT INTO answer_tag (answer_id, tag_id) VALUES ($answer_id, $tag_id)";
  mysqli_query($conn, $sql);
}

이제 사용자가 선택한 태그를 질문 및 답변과 성공적으로 연결했습니다. 다음으로는 태그 클라우드와 주제 집계 기능을 구현하겠습니다.

먼저 모든 태그와 태그 발생 횟수를 가져오는 PHP 함수를 작성해야 합니다.

function getTagsCloud() {
  global $conn;
  
  // 查询所有标签及其出现次数
  $sql = "SELECT title, COUNT(*) AS count FROM tags GROUP BY title";
  $result = mysqli_query($conn, $sql);
  
  $tagsCloud = array();
  while ($row = mysqli_fetch_assoc($result)) {
    $tagsCloud[$row['title']] = $row['count'];
  }
  
  return $tagsCloud;
}

그런 다음 프런트 엔드 페이지에서 이 기능을 사용하여 태그 클라우드를 표시할 수 있습니다.

<?php
// 获取标签云数据
$tagsCloud = getTagsCloud();
?>

<!-- 标签云 -->
<div class="tag-cloud">
  <?php foreach ($tagsCloud as $tag => $count): ?>
    <a href="search.php?tag=<?php echo $tag; ?>"><?php echo $tag; ?></a>
  <?php endforeach; ?>
</div>

드디어 주제 집계 기능, 즉 태그를 기반으로 관련 질문과 답변을 쿼리하는 기능을 구현할 수 있습니다.

function getQuestionsByTag($tag) {
  global $conn;
  
  // 根据标签获取问题
  $sql = "SELECT q.id, q.title, q.date, COUNT(*) AS answersCount 
          FROM questions q 
          INNER JOIN question_tag qt ON q.id = qt.question_id 
          INNER JOIN tags t ON t.id = qt.tag_id 
          WHERE t.title = '$tag' 
          GROUP BY q.id";
  $result = mysqli_query($conn, $sql);
  
  $questions = array();
  while ($row = mysqli_fetch_assoc($result)) {
    $questions[] = $row;
  }
  
  return $questions;
}

function getAnswersByTag($tag) {
  global $conn;
  
  // 根据标签获取回答
  $sql = "SELECT a.id, a.content, a.date, q.title 
          FROM answers a 
          INNER JOIN answer_tag at ON a.id = at.answer_id 
          INNER JOIN tags t ON t.id = at.tag_id 
          INNER JOIN questions q ON q.id = a.question_id 
          WHERE t.title = '$tag'";
  $result = mysqli_query($conn, $sql);
  
  $answers = array();
  while ($row = mysqli_fetch_assoc($result)) {
    $answers[] = $row;
  }
  
  return $answers;
}

주제 세부정보 페이지에서 위 두 가지 기능을 사용하여 관련 질문과 답변을 표시할 수 있습니다.

<?php
// 获取标签名称
$tag = $_GET['tag'];

// 获取话题相关的问题和回答数据
$questions = getQuestionsByTag($tag);
$answers = getAnswersByTag($tag);
?>

<!-- 话题相关的问题 -->
<?php foreach ($questions as $question): ?>
  <div class="question">
    <h3><?php echo $question['title']; ?></h3>
    <p>回答数量: <?php echo $question['answersCount']; ?></p>
    <!-- 其他问题信息展示 -->
  </div>
<?php endforeach; ?>

<!-- 话题相关的回答 -->
<?php foreach ($answers as $answer): ?>
  <div class="answer">
    <h4><?php echo $answer['title']; ?></h4>
    <p><?php echo $answer['content']; ?></p>
    <!-- 其他回答信息展示 -->
  </div>
<?php endforeach; ?>

위 코드 예시를 통해 지식 질의응답 사이트에 태그 클라우드와 주제 집계 기능을 성공적으로 구현했습니다. 사용자는 핫 토픽과 관련 질문과 답변을 쉽게 탐색할 수 있습니다. 동시에 독자가 코드 구현 아이디어를 더 잘 이해할 수 있도록 해당 데이터베이스 작업 예제도 제공합니다. 이 글이 도움이 필요한 독자들에게 도움이 되기를 바랍니다.

위 내용은 PHP는 지식 질문과 답변 웹사이트에 태그 클라우드와 주제 집계 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.