php - 使用嵌套的 while 循环不提供所需的输出

标签 php mysql pdo

我想做的是创建一个从数据库中提取的类别列表,然后在每个类别下面列出 相关的子类别。

到目前为止我有:

<?php
// this query lets us know that we are looking for matches that equal 2,      which points to the subject of vehicles.
// from this query i am able to list all categories that are relevant to vehicles.

$getCategoriesQuery = $db->query("SELECT * FROM item_cat WHERE sub_id =  '2'"); //2 = vehicles
?>

<?php
while($row = $getCategoriesQuery->fetch()){
    echo '<ul>'.$row['category'].'';
}
?>

显示:

- motor vehicles
- railed vehicles
- aircraft

现在,当我将以下 while 循环添加到上面的循环时:

<?php
while($row = $getCategoriesQuery->fetch()){
    echo '<ul>'.$row['category'].'';

    // this has been added to try and get the sub categories
    $getSubCatQuery = $db->query("SELECT * FROM item_cat, item_sub_cat
                WHERE item_cat.cat_id = item_sub_cat.cat_id "); // cat_id
        while($row = $getSubCatQuery->fetch()){
            echo '<li><a href="vehicles.php?p='.$row['sub_category'].'"  >'.$row['sub_category'].'</a></li>';

        }
    echo '</ul>';
}
?>

我得到:

- motor vehicles
   - cars
   - motorbikes
   - buses
   - trucks
   - trains
   - planes
-railed vehicles
   - cars
   - motorbikes
   - buses
   - trucks
   - trains
   - planes
-aircraft
   - cars
   - motorbikes
   - buses
   - trucks
   - trains
   - planes

当我想做的是:

-motor vehicles
   - cars
   - motorbikes
   - buses
   - trucks
-railed vehicles
   - trains
-aircraft
   - planes

我一开始尝试加入查询,但没有任何乐趣,所以我分成 2 个查询来尝试更好地了解情况。 我已经在第二个 while 循环中将“$row”更改为“$row2”,但这会给我一个“row2['sub_category']”的未定义索引错误

我也尝试过使用“foreach 循环”而不是第二个“while 循环”:

<?php
// this query lets us know that we are looking for matches that equal 2, which points to vehicles.
$getCategoriesQuery = $db->query("SELECT * FROM item_cat WHERE sub_id = '2'"); //vehicles
?>

<?php
while($row = $getCategoriesQuery->fetch()){
    echo '<ul>'.$row['category'].'';

    $getSubCatQuery = $db->query("SELECT * FROM item_cat, item_sub_cat
                    WHERE item_cat.cat_id = item_sub_cat.cat_id "); // cat_id

        foreach ($getSubCatQuery->fetchAll () as $row2) {
        echo '<li><a href="vehicles.php?p='.$row2['sub_category'].'"  >'.$row2['sub_category'].'</a></li>';
        }
    echo '</ul>';
}
?>

我花了一整天的时间试图解决这个问题,但没有任何快乐——只有头痛。谁能告诉我哪里出错了......我错过了什么? - 如果不清楚,我也在使用 PDO。

提前致谢!

--更新-- 我已将 while 循环部分更改为:

<?php
while($row = $getCategoriesQuery->fetch()){
    echo '<ul>'.$row['category'].'';

    $getSubCatQuery = $db->query("SELECT * FROM item_sub_cat, item_cat WHERE  item_sub_cat.cat_id ='".$row['cat_id']."' ");
        while($sub_row = $getSubCatQuery->fetch()){
            echo '<li><a href="vehicles.php?p='.$sub_row['sub_category'].'"  >'.$sub_row['sub_category'].'</a></li>';

        }
    echo '</ul>';
}
?>

并且输出显示了正确类别中的事物....但是它通过我在数据库中的总记录复制了每个项目:

- motor vehicles
  - cars
  - motorcycles
  - trucks
  - buses
  - cars
  - motorcycles
  - trucks
  - buses
  - cars
  - motorcycles
  - trucks
  - buses
  - cars
  - motorcycles
  - trucks
  - buses
  - cars
  - motorcycles
  - trucks
  - buses
- railed vehicles
  - trains
  - trains
  - trains
  - trains
  - trains

我已经尝试在查询中添加“LIMIT 1”和“GROUP BY”,但是每个类别只显示 1 个项目。

- motor vehicles
  - cars
- railed vehicles
  - trains

最佳答案

您的内部 while 循环正在重新分配 $row 数组变量。将其更改为另一个名称,例如 $sub_row

您的内部查询也不会根据外部查询的值而改变,因此每次都以完全相同的方式执行。使用类似的东西 SELECT * FROM item_sub_cat WHERE item_sub_cat.cat_id = $row["category_id"] 内部查询将允许结果依赖于外部查询的每个结果。

编辑:注意不要在查询中包含在输出方面不需要的表。仅当您需要执行两个表的连接时才包括它们。

关于php - 使用嵌套的 while 循环不提供所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35173950/

相关文章:

php - 选择 COUNT 列和 GROUP BY

python - 我尝试创建我的第一个数据库,但出现错误

java - Java 中的 MySql 表监听器

php - jQuery AJAX 问题 - 页面在提交时不断刷新且数据未发送

php - 如何在每个页面上验证用户 session

php - 使用来自 MySQL 中许多不同关系表的数据运行 Solr

php - 在 phpmyadmin 中编辑的 mysql 数据库不会在 php 脚本中返回查询

mysql - PDO 如何传递 ID Key

php - 排序函数是否考虑多级数组中的叶节点?

mysql - 如何在 MySQL 中选择唯一行后跟具有最高值的行?