0

我有一张桌子,里面有或多或少的博客文章。结构如下:

  1. id INT 主键 AUTO_INCREMENT
  2. 用户 VARCHAR
  3. 标题 VARCHAR
  4. 类别 VARCHAR
  5. 部分 VARCHAR
  6. post_body 文本
  7. post_date DATETIME

部分字段基本上是一个子类别。我有第二个表的部分:

  1. id INT 主键 AUTO_INCREMENT
  2. section_name VARCHAR
  3. 类别 VARCHAR

我一直在尝试做的是在页面上创建一个列表,其结构如下:

科学(这是类别)

地质学(本第一节)

标题1

标题2

标题3

ETC

生物学(第二部分)

标题1

标题2

标题3

ETC

等等,适用于所有科学类别的部分

当用户单击以查看科学类别中的文章时,他们会进入此页面。

我已经尝试了很多事情来实现这一点,但都没有成功。获取要显示的部分名称很容易,但是根据从第一个查询中检索到的部分对所有文章标题进行查询是我卡住的地方,所以这是我的代码:

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];
    }
}
4

1 回答 1

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>";
}

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

于 2013-04-12T00:50:39.573 回答