php - 从 SQL 数据库中排序类别列表中的一组子类别

标签 php database loops mysqli while-loop

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

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

但是我的问题是子目录1和子目录2的parentid为1,它符合 header 1,但是othersubcat 1的parentid为5。它实际上符合 header 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

感谢您的帮助

最佳答案

对于您想要做的事情,请遵循 @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>';
                }
            }
        }

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

关于php - 从 SQL 数据库中排序类别列表中的一组子类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076693/

相关文章:

database - 在数据库列中存储分隔列表真的那么糟糕吗?

php - 如何显示表中的所有数据?

javascript - 如何阻止 YouTube 使用内置浏览器?

javascript - 如何解决 wkhtmltopdf 中的 javascript 或 http 错误?

php - 跟踪投票并只允许每个成员投一票

java - 用一个循环写一个快速排序

javascript - 附加到 svg 的圆圈数量不正确

php - MVC ajax 调用 - 在哪里处理它们?

php - Laravel 从数据库中返回用户最后一项

mysql - CakePHP 用户登录功能