2

我有这个代码,但我不知道如何订购我的查询

function get_All_Categories(){
//new instance of mysqli
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    //if it doesn't work give an error
    if (!$mysqli) {
        die('There was a problem connecting to the database.');
    }
    $queryCats ="SELECT Catid, Catname
                 FROM ProductCats
                 ORDER BY Catid";
    $querySubCats ="SELECT Subcatname, Parentid
                    FROM ProductSubCats, ProductCats
                    WHERE ProductSubCats.Parentid = ProductCats.Catid
                    ORDER BY Subcatname;";
    if ($catResults = $mysqli->query($queryCats)){
        if (!$catResults) {
            echo 'Could not run query: ' . mysql_error();
            exit;
        }
        else{
            $subCatResults = $mysqli->query($querySubCats);
        }
        while ($rows = $catResults->fetch_assoc()) {
            echo '<div class = "categoryCluster">';
            echo '<a href="../index.php?Cat='.$rows["Catname"].'">'.$rows["Catname"].'</a>';
            echo '<br>';
            while($rowsSub = $subCatResults->fetch_assoc()){
                echo '<div class="subCategoryCluster">';
                echo '&emsp;'.'<a href="../index.php?Cat='.$rows["Catname"].'&'.'Subcat='.$rowsSub["Subcatname"].'">'.$rowsSub["Subcatname"].'</a>';
                echo '<br>';
                echo '</div>';
            }
            echo '</div>';
        }
    }
    $mysqli->close();
}

显示此输出:

Header 1
 Subcat 1
 Subcat 2
 OtherSubcat 1
Header 2
Header 3
Header 4
Header 5
Header 6

但我的问题是 subcat 1 和 subcat 2 的 parentid 为 1,符合标头 1,但是 othersubcat 1 的 parentid 为 5。实际上符合标头 5。是的,在我的循环中,它显示在其他 2 之后.

现在我知道为什么这是错误的了,这是因为 while 循环中的 while 循环命令它最后出现,并将其粘贴在那里。

但我完全不知道如何修改它以使其显示:

Header 1
 Subcat 1
 Subcat 2
Header 2
Header 3
Header 4
Header 5
 OtherSubcat 1
Header 6

样品表:

>     ProductSubCats
>     Subcatid  |  Subcatname   | Parentid
>     1         | Subcat 1      | 1
>     2         | Subcat 2      | 1
>     3         | Othersubcat 3 | 5
> 
> 
> 
> ProductCats
>     Cat id   |   Catname
>     1        | Header 1
>     2        | Header 2
>     3        | Header 3
>     4        | Header 4
>     5        | Header 5
>     6        | Header 6

感谢您的帮助

4

2 回答 2

1

您需要将数据库查询循环与显示循环分开。首先为两个查询获取所有数据并将其存储在两个关联数组中。为了使第二步更容易,按如下方式构建您的子类别数组:

  • 键 - 父 ID
  • 值 - 具有此父 ID 的所有子类别的数组

其次,遍历类别数组。对于每个元素:

  • 打印出类别名称
  • 循环使用此父 ID 的子类别 - 打印它们

像这样:

//assuming you populated $catResults and $subCatResults as in your example
$categories = array();
$sub_categories = array();

while($row = $catResults->fetch_assoc()) {
 $categories[$row['Catid']] = $row['Catname'];
}
while($row = $subCatResults->fetch_assoc()) {
 if (!isset($sub_categories[$row['Parentid']])) {
  $sub_categories[$row['Parentid']] = array();
 }
 $sub_categories[$row['Parentid']][] = $row['Subcatname'];
}

//display
foreach ($categories as $cat_id => $name) {
 echo $name;
 if (isset($sub_categories[$cat_id])) {
  foreach($sub_categories[$cat_id] => $sub_cat_name) {
   echo '  ' . $sub_cat_name;
  }
 }
}
于 2012-12-28T23:04:51.053 回答
1

对于您要执行的操作,请遵循 @Pasha Bitz 所说的内容。

尝试以下操作:

$categories = array();
        $sub_categories = array();  
        while ($rows = $catResults->fetch_assoc()) {
            $categories[$rows['Catid']] = $rows['Catname'];
        }
        while($rows = $subCatResults->fetch_assoc()){
            if (!isset($sub_categories[$rows['Parentid']])) {
                $sub_categories[$rows['Parentid']] = array();
            }
            $sub_categories[$rows['Parentid']][] = $rows['Subcatname'];
        }
        foreach ($categories as $cat_id => $name) {
            echo '<div class = "categoryCluster">';
            echo '<a href="../index.php?Cat='.$name.'">'.$name.'</a>';
            echo '<br>';
            if (isset($sub_categories[$cat_id])) {
                foreach($sub_categories[$cat_id] as $cat_id => $sub_cat_name) {
                    echo '<div class="subCategoryCluster">';
                    echo '&emsp;'.'<a href="../index.php?Cat='.$name.'&'.'Subcat='.$sub_cat_name.'">'.$sub_cat_name.'</a>';
                    echo '<br>';
                }
            }
        }

那应该为您解决这个问题,研究代码,以便您了解这里发生了什么。

于 2012-12-29T14:59:31.607 回答