使用PHP+MySQL显示带有子类别和n个子类别的类别


Show categories with subcategories and n-sub categories using PHP+MySQL

我的代码有问题。显示有n个子类别的所有类别的最佳方法是什么?

MySQL数据库如下:

CREATE TABLE categories ( 
category_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
parent_id INT UNSIGNED NOT NULL DEFAULT 0, 
name TEXT NOT NULL, 
user INT NOT NULL, 
PRIMARY KEY (category_id), 
INDEX parent (parent_id)
);

其中user是来自另一个表的id(如果类别有user = '2',则有id = '2'的用户可以看到该类别)

category_id   parent_id   name                   user
1             0           Main category 1        2
2             1           Subcategory 1          2
3             1           Subcategory 2          2
4             3           SubSubcategory 1       2
我的php代码:
<?php 
    include('config.php'); //Mysql connect file
//get id from user
 if($_GET['id'] != $user_id) {
    $id = $_GET['id'];
//check to make sure the user is an admin, who can change mysql
$result = mysql_query("SELECT * FROM users WHERE username = '$username' AND admin = '1'");
$rowCheck = mysql_result($result, 0);

//if the query returns a number, we know the user is an admin. And here we can VIEW our categories
if($rowCheck > 0) { 
$user_result = mysql_query("SELECT * FROM users, categories WHERE id = '$id'");
     while($row = mysql_fetch_array($user_result)) { ?>     
        <ol>
        <li><a href=""><?php echo $row['name']; ?></a></li>
        </ol>
    <?php }
    } else {
        echo "You are not admin";
     }    
//bla bla bla etc.
...
 }

如何查看像

这样的类别
<ol>
 <li>
 <a href="">Main category 1</a>
      <ol>
      <li><a href="">Subcategory 1</a></li>
      <li><a href="">Subcategory 2</a>
          <ol>
              <li><a href="">Subsubcategory 1</a></li>
          </ol>
      </li>
      </ol>
 </li>
</ol>

试试这个

$result = mysql_query("SELECT * FROM users WHERE username = '$username' AND admin = '1'");
$rowCheck = mysql_result($result, 0);   
//if the query returns a number, we know the user is an admin. And here we can VIEW our categories
if($rowCheck > 0) { 
//First fetch only parent categories
$first_level_cats = mysql_query("SELECT * FROM categories WHERE user = '$id' AND parent_id = 0");
     echo '<ol>';
     while($row = mysql_fetch_array($first_level-cats)) { ?>     
        <li><a href=""><?php echo $row['name']; ?></a></li>
        <?php
         $second_level_cats = mysql_query("SELECT * FROM categories WHERE user = '$id' AND parent_id = $row['id']");
     echo '<ol>';
     while($row = mysql_fetch_array($second_level-cats)) { ?>     
        <li><a href=""><?php echo $row['name']; ?></a></li>              
        <?php 
          $third_level_cats = mysql_query("SELECT * FROM categories WHERE user = '$id' AND parent_id = $row['id']");
     echo '<ol>';
     while($row = mysql_fetch_array($sthird_level-cats)) { ?>     
        <li><a href=""><?php echo $row['name']; ?></a></li>              
        <?php
            }
          echo '</ol>'; //third level close
        ?>
          } 
         echo '</ol>'; // second level close
        ?>    
    <?php }
   echo '</ol>';  // first level close
    } else {
        echo "You are not admin";
     }    
//bla bla bla etc.
...
 }

我已经尽力解决你的问题,根据你的schema交叉核对table name and columns

尝试使用Mysqli扩展代替Mysql

$user_result = mysql_query("SELECT * FROM users, categories WHERE id = '$id'");
     $categories = array();
     while($row = mysql_fetch_array($user_result)) {     
       $categories[$row['parent_id']][] = $row['name']; 
     }
     echo "<ol><li><a href''>$categories[0][0]</a><ol>";
     $counterj = count($categories)-1;
     for($i=1,$j=$counterj;$i<$j;$i++){
        if(count($categories[$i])==1){
           echo "<li><a href="">$catgeories[$i][0]</a></li>";
        } else {
           echo "<li><a href="">$categories[$i][0]</a><ol>";
        }
        $counterl = count($categories[$i])-1;
        for($k=1,$l=$counterl;$k<$l;$k++){
           echo "<li><a href="">$categories[$i][$k]</a></li>";
        }
        if ($l>1) echo "</ol></li>";
     }
     echo "</ol></li></ol>";
} else {
     echo "You are not admin";
}