PDO在内部运行查询,而循环只显示1个结果

时间:2017-10-28 11:59:55

标签: php mysql sql pdo

我想获得类别和子类别。两个表都有不同的表。请参阅下表结构:

  

tbl_category

 id | name   | order_number
  1 | Allgem | 1
  2 | Vorauss| 2
  3 | Support| 3
  4 | Zielste| 4
  

tbl_sub_category

 id | cat_id   | sub_name
  1 | 1        | Alter 
  2 | 2        | Trainingsalter
  3 | 2        | Kader
  4 | 2        | Wettkampfsystem
  5 | 3        | Trainingsort
  6 | 3        | Team
  7 | 4        | Betreuung
  8 | 4        | Unterstuetzung

我尝试过以下答案:

query inside while loop only shows 1 result

以下是我的代码:

<ul class="list-unstyled components">
    <p style="text-align: center;font-weight: 600">Categories</p>
    <?php
        $query = $conn->prepare('SELECT * FROM tbl_category');
        $query->execute();
        $i = 1;
        $firstResults = array();
        while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        $ID = $row['id'];
    ?>
    <li class="">
        <a href="#homeSubmenu<?php echo $i;?>" data-toggle="collapse" aria-expanded="false"><?php echo $row['cat_name']; ?></a>
        <?php 
            $querySub = $conn->prepare('SELECT * FROM tbl_sub_category WHERE cat_id=:cat_id');
            $querySub->execute(array(':cat_id' => $ID));
            while ($rowSub = $querySub->fetch(PDO::FETCH_ASSOC)) {
        ?>
        <ul class="collapse list-unstyled" id="homeSubmenu<?php echo $i;?>">
            <li><a href="?cat=Allgem&sub=Beschreibung"><?php echo $rowSub['sub_name']; ?></a></li>
        </ul>
        <?php } ?>
    </li>
    <?php $i++; } ?>
</ul>

请帮助我们!!!!

更新的问题:

enter image description here

请参阅上表中两个表的关系。

1 个答案:

答案 0 :(得分:4)

尝试像这样的加入

SELECT
    c.name,
    sc.*,
    c.order_number
FROM
    tbl_sub_category AS sc
INNER JOIN
    tbl_category AS c ON c.id = sc.cat_id

你可以在这里测试一下 https://www.db-fiddle.com/f/vX8Z6jPbaweBDjGtvPwRdP/0

没有必要提取c.id (无论如何都是模棱两可的)并且您已将其作为sc.cat_id。所以,我们真正需要的是来自子类别表(别名为sc的所有内容,以及来自类别表的类别名称和order_number(别名为{{1) }})

如果您需要没有子类别的主要类别,那么您可以进行左连接。你必须考虑一些空值,无论如何都是如此。

c

这一个在这里 https://www.db-fiddle.com/f/kdgD9K5TYnD79boUdaC57k/0

我故意离开了子类别6&amp; 7,为了显示它如何为左连接工作,这种方式cat 4没有任何子类别。如果您需要考虑这些问题,那么拥有一个合适的测试用例是一个好主意。

在您的查询排除(一次调用而不是O {n}次调用)之后,您将遵循非常标准的过程,构建数据然后输出它。像这样:

SELECT
    c.name,
    sc.*,
    c.order_number
FROM
    tbl_category AS c
LEFT JOIN
     tbl_sub_category AS sc ON c.id = sc.cat_id

要做的第一件事是按类别对数据进行分组,因此我们可以为类别设置项目,为子类别设置多个项目。类别名称<?php $data = $conn->query($sql)->fetchAll(PDO::FETCH_GROUP); ?> 对此非常有用,因为我们需要在内部foreach循环之外。 正如@YourCommonSense所述,在评论中,我们可以使用$row['name']轻松完成此操作,并将PDO::FETCH_GROUP列作为选择列表中的第一列。

这会给你这样的东西:

name

如您所见,现在我们有一个按猫ID分组的结构。这对于我们下一步需要做的事情会更好。因为我们按照我们想要的方式预先格式化数据,所以我们的代码更简单,更简洁,更易于阅读。

$data = [
    'Allgem' => [
        ['id'=>'1','cat_id'=>'1','sub_name'=>'Alter','name'=>'Allgem','order_number'=>'1'],
    ],
    'Vorauss' => [
        ['id'=>'2','cat_id'=>'2','sub_name'=>'Trainingsalter','name'=>'Vorauss','order_number'=>'2'],
        ['id'=>'3','cat_id'=>'2','sub_name'=>'Kader','name'=>'Vorauss','order_number'=>'2'],
        ['id'=>'4','cat_id'=>'2','sub_name'=>'Wettkampfsystem','name'=>'Vorauss','order_number'=>'2'],
    ],
    'Support' => [
        ['id'=>'5','cat_id'=>'3','sub_name'=>'Trainingsort','name'=>'Support','order_number'=>'3'],
        ['id'=>'6','cat_id'=>'3','sub_name'=>'Team','name'=>'Support','order_number'=>'3'],
    ]
];

你可以在这里进行测试,但几乎不可能找到一个允许你混合HTML,PHP,保存和HTML输出的phpSandbox。所以它只是原始源html,但你可以看到它在语法上是正确的,没有错误。

http://sandbox.onlinephpfunctions.com/code/1030bfd98c73d12b718077363d30ac587166c6cb

关于错误的主题,您还有其他几个问题。就像子链接有一个静态地址<ul class="list-unstyled components"> <p style="text-align: center;font-weight: 600">Categories</p> <?php $i = 0; foreach ($data as $cat_name => $sub_categories): ?> <li class=""> <a href="#homeSubmenu<?php echo $i;?>" data-toggle="collapse" aria-expanded="false"><?php echo $cat_name ; ?></a> <?php foreach ($sub_categories as $row): ?> <ul class="collapse list-unstyled" id="homeSubmenu<?php echo $i;?>"> <li><a href="?cat=Allgem&sub=Beschreibung"><?php echo $row['sub_name']; ?></a></li> </ul> <?php endforeach; ?> </li> <?php $i++; endforeach; ?> </ul> 。您的表架构(仅<a href="?cat=Allgem&sub=Beschreibung">中不存在$row['cat_name']。另一个是第一个tbl_category.name<p>之间的<ul>标记我没有看到合理的方法来修复它而不改变结构,因为结构很好。见下文:

<li>

就个人而言,我建议使用词典列表,或<ul class="list-unstyled components"> <p style="text-align: center;font-weight: 600">Categories</p> <!-- p tags shouldn't be here --> .... <li class="">

https://www.w3schools.com/tags/tag_dl.asp

这会让你做这样的事情

<dl>

或者只是完全删除<dl class="list-unstyled components"> <dt><p style="text-align: center;font-weight: 600">Categories</p></dt <dd class=""><!-- instead of the li tag --></dd> </dl> 标记?无论如何,我原来的HTML可能还有其他问题,我没有看到。但我认为这可以让你走上正轨。

干杯。