用于列出PHP类别和子类别的逻辑

时间:2013-04-11 23:03:37

标签: php mysql pdo iteration

我有一个表格,其中包含或多或少的博客文章。结构如下:

  1. id INT PRIMARY KEY AUTO_INCREMENT
  2. user VARCHAR
  3. title VARCHAR
  4. category VARCHAR
  5. section VARCHAR
  6. post_body TEXT
  7. post_date DATETIME
  8. section字段基本上是一个子类别。 我有第二个表格:

    1. id INT PRIMARY KEY AUTO_INCREMENT
    2. section_name VARCHAR
    3. category VARCHAR
    4. 我一直在尝试做的是在页面上创建一个列表,其结构如下:

      科学(这是类别)

      地质(这是第一部分)

      TITLE1

      TITLE2

      TITLE3

      生物学(第二部分)

      TITLE1

      TITLE2

      TITLE3

      等所有具有科学范畴的部分

      当用户点击查看科学类别中的文章时,他们会登陆此页面。

      我已经尝试过很多事情来实现这个目标但却没有成功。获取显示的部分名称很简单,但根据从第一个查询中检索到的部分查询所有文章标题是我被困的地方,所以这里是我的代码到那时为止:

      if(isset($_GET['cat'])){
          $cat = preg_replace('#[^a-z0-9_]#i','',$_GET['cat']);
          $cat = str_replace('_',' ',$_GET['cat']);
          $stmt = $db->prepare("SELECT section_name FROM sections WHERE category=:cat GROUP BY section_name");
          $stmt->bindValue(':cat',$cat,PDO::PARAM_STR);
          try{
              $stmt->execute();
          }
          catch(PDOException $e){
              echo $e->getMessage();
              $db = null;
              exit();
          }
          while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
              $sectionName = $row[section_name];
          }
      }
      

1 个答案:

答案 0 :(得分:1)

我建议你扩大查询的范围,用标记每个标题的部分,然后只循环标题(表示你有一个部分更改)。

$stmt = $db->prepare("SELECT section_name FROM sections t1, title FROM posts t2  WHERE t1.category=:cat AND t1.section_name = t2.section GROUP BY section_name");

现在你有了你想要显示的标题列表,循环遍历它们:

$currentSection = null;
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
  $sectionName = $row[section_name];
  if ($sectionName != $currentSection) {
    echo "<h2>".$sectionName."</h2>";
    $currentSection = $sectionName;
  }
  echo "<p>".$row['title']."</p>";
}

您还可以创建一个数组,其中部分名称作为键,标题作为nester数组的成员。当然,它可以变得更复杂,但我希望这能让你很好地了解从哪里开始。