ホームページ  >  記事  >  バックエンド開発  >  PHP は、知識の質問と回答の Web サイトにタグ クラウドとトピックの集約機能を実装します。

PHP は、知識の質問と回答の Web サイトにタグ クラウドとトピックの集約機能を実装します。

WBOY
WBOYオリジナル
2023-07-01 22:03:08806ブラウズ

PHP は、ナレッジ Q&A Web サイトにタグ クラウドとトピック集約機能を実装します。

ナレッジ Q&A Web サイトでは、タグ クラウドとトピック集約の 2 つの重要な機能があります。タグ クラウドを使用すると、ユーザーは Web サイト上の注目のトピックや一般的なタグをすばやく理解できるようになり、関連する質問と回答の閲覧や検索が容易になります。トピックの集約により、質問と回答を同じタグでグループ化することができ、ユーザーはより便利に表示および議論できるようになります。以下では、PHP を使用してこれら 2 つの関数を実装します。

まず、質問、回答、タグのデータを保存するデータベースを作成する必要があります。質問、回答、タグの 3 つのテーブルを含む「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;

answers テーブルの構造は次のとおりです。

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;

次に、Q&A Web サイトの質問と回答のページにタグ選択ボックスを追加し、ユーザーが選択したタグを質問または回答に関連付ける必要があります。

<!-- 提问页面 -->
<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;
}

トピック詳細ページで上記の 2 つの機能を使用して、関連する質問と回答を表示できます。

<?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; ?>

上記のコード例を通じて、ナレッジ Q&A Web サイトにタグ クラウドとトピック集約機能を実装することに成功しました。これにより、ユーザーはホット トピックや関連する質問と回答を簡単に閲覧できるようになります。同時に、読者がコードの実装アイデアをよりよく理解できるように、対応するデータベース操作の例も提供します。この記事が困っている読者の役に立てば幸いです。

以上がPHP は、知識の質問と回答の Web サイトにタグ クラウドとトピックの集約機能を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。