我想获取类别和子类别。两个表都有不同的表。请参见下表结构:
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>
请帮助我们!!!!
更新的问题:
请看上面两个表的表关系。
最佳答案
像这样尝试加入
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
)中的所有内容以及类别表(别名为c
)中的类别名称和订单号.
如果您需要没有子类别的主要类别,那么您可以执行左连接。您将不得不考虑一些空值,无论如何都是如此。
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
还有这个 https://www.db-fiddle.com/f/kdgD9K5TYnD79boUdaC57k/0
我故意将子类别 6 和 7 排除在外,以展示它如何用于左连接,这样 cat 4 就没有任何子类别。如果您需要考虑这些问题,最好有一个适当的测试用例。
在您整理好查询后(一次调用而不是 O{n} 次调用),您将遵循相当标准的程序,构建数据然后输出它。像这样:
<?php
$data = $conn->query($sql)->fetchAll(PDO::FETCH_GROUP);
?>
首先要做的是按类别对数据进行分组,这样我们就可以有一个类别项和多个子类别项。分类名称$row['name']
非常适用于此,因为我们需要在内部 foreach 循环之外使用它。
正如@YourCommonSense 所提到的,在评论中,我们可以使用 PDO::FETCH_GROUP
轻松做到这一点。并把 name
列作为我们选择列表中的第一列。
这会给你这样的东西:
$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'],
]
];
如您所见,现在我们有一个按猫 ID 分组的结构。这对于我们接下来需要做的事情会更好。因为我们按照我们想要的方式预先格式化数据,所以我们的代码更简单、更简洁、更易于阅读。
<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>
您可以在此处进行测试,但几乎不可能找到允许您混合 HTML、PHP、保存并以 HTML 格式输出的 phpSandbox。所以它只是原始源 html,但您可以看到它在语法上是正确的并且没有错误。
http://sandbox.onlinephpfunctions.com/code/1030bfd98c73d12b718077363d30ac587166c6cb
关于错误主题,您还有其他几个问题。就像子链接有一个静态地址 <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="">
就个人而言,我建议使用字典列表,或 <dl>
https://www.w3schools.com/tags/tag_dl.asp
哪个会让你做这样的事情
<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>
或者只删除 <p>
完全标记?无论如何,您的原始 HTML 可能还有其他我没有看到的问题。但我认为这应该能让您走上正轨。
干杯。
关于php - PDO 在 while 循环内运行查询只显示 1 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46989488/