设一个这样的表
id  name       url             cid    
1   首页       index.php        1_1
2   产品       pro.php          2_1
3   衣服       pro.php?id=yefu  2-2
4   裤子       ku.php           2_3
5   大人裤子   ku_da.php        2_3_1
6   小人裤子   ku_xiao.pl       2_3_2上面的cid用于分级 1_1是一级类 1_2,1_3....是二级类...1_2_1,1_2_2...是三级,之后四级...while($数组=....(select * from 表 order by 如果用你还要加一个排序id)
{
     用if语句,对cid进行分解...不同级别echo不同的内容及链接;
}
这样的方法是只查询一次数据库,就可以了.....
更多功能,
就要看你的字段加多少了...

解决方案 »

  1.   

    写成函数递归,
    function outMenu($fid)
    {
         if(null == $fid)  $fid =0; 
         
         //列出fid为$fid的数据
         if(cid是否有子级)
         {
                输出菜单项
                outMenu($cid);
         }
         else
                输出菜单项
             
         
    }
      

  2.   

    珠海的办法有问题呀
    cid中的数值实际上已经是在对数据进行分类了,但是要获得这样的一组分类id我还得再写一个程序,由于我很懒,所以我也就懒得去写这样一个字符串处理程序。所以其不可行。
    另外随着分类的细化,cid会越来越长,虽然只有一次查询却要查找老长一段cid容易出错不说,光效率就值得商榷了。个人看法,呵呵!用递归来实现我觉得倒是可行,我试着写一下,如果写不出来再向高手们请教。
      

  3.   

    其实提供你的想法只是我在实际应用的心得而已,
    一个导航用for语句进行数据库查询,
    对mysql的压力是相当大的...做一个好的后台,
    请前台更轻松些.....哈哈~~
      

  4.   

    对于数据量少的情况用递归速度也是飞快的,但如果你要真正达到无限数量级(大量数据),还是动态加载吧!ChinaZhuhai(中国-珠海) 的方法对一定的几十K数据量还是十分优秀的,我一般也是这样做的!
      

  5.   

    作为一个新闻网站其数据量是不会小的,如果动态加载应当如何实现?
    对了,下面是我写的递归,但有一点问题。
    function outmenu($cid,$fid)
    {
         if($fid =="")  $fid=0; 
         
         //列出fid为$fid的数据
        if($fid>1)
         {
    $p1="";
            $sql="select name,fid from category where cid=$fid";//找上一级
    $result=@mysql_query($sql);
    $array=@mysql_fetch_array($result);
    $name=$array["name"];
    $uid=$array["fid"];
    $p1.="&nbsp;<a href=show_category.php?cid=$fid&&fid=$uid>$name</a
    echo ("$p1");
    $sql="select name,fid from category where cid=$cid";//找本一级
    $result=@mysql_query($sql);
    $array=@mysql_fetch_array($result);
    $cname=$array["name"];
    $nfid=$array["fid"];
    $p1=">>&nbsp;<a href=show_category.php?cid=$cid&&fid=$nfid>$cname</a>".$p1;

    outmenu($nfid,$nfid);

    }
    if($fid==1) 
    {      
    $sql="select name,fid from category where cid=$cid"; $result=@mysql_query($sql);
    while($array=@mysql_fetch_array($result)) {
    $cname=$array["name"];
    $nfid=$array["fid"];
    echo "&nbsp;fid=$nfid&nbsp";
    $p1="<a href=show_category.php?cid=$cid&&fid=$fid>$cname</a>";

    }
    /*end while*/;

    }
    Return $p1;

    }它能够输出所有的栏目,但是输出时多了一些东西。当栏目多于三级时,结果是:
     b1 b1 B 伊拉克 时事新闻
    b1重复了一次。如何把这个重复项去掉,而且最后的数据要卦装到一个变量中,现在也做不到,只能echo出来。我认为这个递归的结束条件是在当前目录里找不到一个fid等于其cid。不知我的看法是否正确。
    还望高手们指教!
      

  6.   

    给大家提供一个源代码的下载地址:http://c994.cailiao.5470.org/site.rar解压之后运行index.php会跳转到show/show_index.php页。点栏目名会进到各子栏目。我现在在里面设置了一些调试点,用来取id,会在页顶部显示。导航问题很难解决。因为如果是递归显示倒是好办,麻烦的地方是我要将取得的值存入一个变量里,然后解析到模板中。在这个过程中我不可能循环来调用echo 出的值。要增删栏目请运行show/show_modcat.php要改模板请到show/tpl目录现在里面的垃圾代码太多,大家不要笑话我呀。
    解决了问题的高手定送高分哟,其实分倒不是最主要的,能从这个问题中得到一种思路才重要。Do u think so?
      

  7.   

    # phpMyAdmin MySQL-Dump
    # version 2.4.0
    # http://www.phpmyadmin.net/ (download page)
    #
    # 主机: localhost
    # 建立日期: May 04, 2003 at 01:54 AM
    # 伺服机版本: 3.23.52
    # PHP 版本: 4.2.3
    # 数据库 : `5470cn`
    # --------------------------------------------------------#
    # 数据表的结构 `category`
    #CREATE TABLE category (
      cid int(10) unsigned NOT NULL auto_increment,
      fid int(10) unsigned NOT NULL default '0',
      name varchar(50) NOT NULL default '',
      manager varchar(20) default NULL,
      about varchar(255) default NULL,
      num int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (cid),
      UNIQUE KEY cid (cid),
      UNIQUE KEY id (cid),
      KEY name (name)
    ) TYPE=MyISAM;
    # --------------------------------------------------------#
    # 数据表的结构 `discuss`
    #CREATE TABLE discuss (
      did int(10) unsigned NOT NULL auto_increment,
      nid int(10) NOT NULL default '0',
      cid int(10) unsigned NOT NULL default '0',
      fid int(10) unsigned NOT NULL default '0',
      nickname varchar(25) default NULL,
      discuss text NOT NULL,
      isgood tinyint(1) NOT NULL default '0',
      UNIQUE KEY did (did)
    ) TYPE=MyISAM;
    # --------------------------------------------------------#
    # 数据表的结构 `news`
    #CREATE TABLE news (
      nid int(11) unsigned NOT NULL auto_increment,
      cid int(10) default NULL,
      fid int(10) default NULL,
      bigtitle varchar(100) NOT NULL default '',
      childtitle varchar(100) default NULL,
      author varchar(60) NOT NULL default '',
      password tinyint(20) NOT NULL default '0',
      content text,
      keyword varchar(50) default NULL,
      time int(12) default NULL,
      source varchar(50) default NULL,
       tinyint(4) unsigned zerofill NOT NULL default '0000',
      abouturl varchar(70) binary default NULL,
      top tinyint(1) unsigned zerofill NOT NULL default '0',
      squence tinyint(3) unsigned zerofill NOT NULL default '000',
      times tinyint(4) unsigned zerofill NOT NULL default '0000',
      UNIQUE KEY id (nid)
    ) TYPE=MyISAM;
    # --------------------------------------------------------#
    # 数据表的结构 `user`
    #CREATE TABLE user (
      uid int(11) unsigned NOT NULL auto_increment,
      ugroup tinyint(3) unsigned NOT NULL default '0',
      uname varchar(30) binary default NULL,
      upass varchar(50) binary default NULL,
      passque varchar(30) default NULL,
      passans varchar(50) default NULL,
      truename varchar(40) default NULL,
      gender char(2) default NULL,
      email varchar(50) default NULL,
      cate varchar(15) default NULL,
      idcard varchar(18) default NULL,
      province varchar(20) default NULL,
      area varchar(40) default NULL,
      birthyear varchar(5) default NULL,
      birthmonth varchar(5) default NULL,
      birthday varchar(5) default NULL,
      workplace varchar(50) default NULL,
      xueyuan varchar(20) default NULL,
      class varchar(20) default NULL,
      qq varchar(20) default NULL,
      phone varchar(20) default NULL,
      mobilephone varchar(20) default NULL,
      address varchar(100) default NULL,
      touxiang varchar(10) default NULL,
      image blob,
      style varchar(20) default NULL,
      u_group varchar(20) default NULL,
      u_addtime timestamp(14) NOT NULL,
      logtimes int(5) default NULL,
      lasttime datetime default NULL,
      lastip varchar(20) default NULL,
      secure char(2) default NULL,
      signature varchar(255) default NULL,
      flag varchar(20) default NULL,
      PRIMARY KEY  (uid),
      UNIQUE KEY uname (uname),
      UNIQUE KEY uid (uid)
    ) TYPE=MyISAM;
      

  8.   

    随手写的没测试
    function outMenu($fid)
    {
         if(null == $fid)  $fid =0; 
           $sql="select cid,name,fid from category where fid=$fid";
     $result=@mysql_query($sql);
     while($array=@mysql_fetch_array($result))
     {
    $cname = $array["name"];
    $ncid = $array["cid"]; 
    $nfid = $array["fid"];
    echo "&nbsp;fid=$nfid&nbsp";
    $p1="<a href=show_category.php?cid=$cid&&fid=$fid>$cname</a>";
    //你可以用个字段来标记是否有子菜单
                /*
                 if(cid是否有子级)
     {
     outMenu($cid);
             }
    */
    outMenu($cid);
     }   
         
    }
      

  9.   

    不是吧,还要加字段,两个字段还不能确定从属关系吗?这是我今天写的,他可以完整的实现从属关系,但有两个问题,一是排序反了,二是跟我想要的东西有差距,我想得到的是最后能把所有的返回封在一个变量里,然后进行模板解析。如果只能递归输出那也太·%#·¥·#%了吧。有没有办法实现我每给他一个新值,自动加上上一次输出的结果变量,如果能,如何实现;如果不能,为什么?
    function outmenu($cid,$fid)
    {
         if($fid =="")  $fid=0; 
         
         //列出fid为$fid的数据
        if($fid>1)
         {
    $sql="select name,fid from category where cid=$cid";//找上一级
             $result=@mysql_query($sql);
    $array=@mysql_fetch_array($result);
    $cname=$array["name"];
    $nfid=$array["fid"];
    $p1="<<&nbsp;<a href=show_category.php?cid=$cid&&fid=$nfid>$cname</a>";
    echo ("$p1");
    outmenu($nfid,$nfid);
         }
         if($fid==1) 
    {      
        $sql="select name,fid from category where cid=$cid";//为主分类的情况
        $result=@mysql_query($sql);
        while($array=@mysql_fetch_array($result))
                      {
        $cname=$array["name"];
        $nfid=$array["fid"];
        $p1="<a href=show_category.php?cid=$cid&&fid=$fid>$cname</a>";
        echo "$p1";
    }
    /*end while*/;

    }
    Return $p1;

    }
      

  10.   

    其实现在返回的$p1只是当前状态下的栏目名,如果能连上以前的栏目名那就好了。有兴趣的朋友不妨也来研究一下,建一个表category
    数据如下:
    cid   fid   name   
     1     0     A
     2     1     B
     3     1     C
     4     1     D
     5     2     E
     6     2     F
     7     5     G
     8     5     H
     9     7     I
     10    9     J上面是一个从属关系cid是自增的,fid为0的为主栏目。
    以下的关系是cid=5和6的数从属于cid=1,fid=0的主栏目;
    cid=7 cid=8的数从属于cid=5 fid=2的栏目;
    cid=9 fid=7的数从属于cid=7 fid=5的栏目。没什么难理解的地方吧?现在要用函数返回如下要求的数据:
    如果我传了cid=9给函数,那么函数应当返回cid=2 cid=5 cid=7 cid=9 时的数据,并且这些数是在一个变量里,不能循环echo 出来。
    也就是就不能在函数里出现echo.
    我是江郎才尽了,没有办法做到。请教高手们啦。尽量不改数据库结构!
      

  11.   

    有点说明错误,应当是cid=5 fid=2和 cid=6 fid=2的数从属于cid=2 fid=1 的数。
      

  12.   

    好好看书吧!!一是排序反了:如果是数据排序反了只要在查询语句加GROUP BY;如果你想通过子栏目找父栏目的话,你稍做修改就可以了,也不用那么麻烦的。二是跟我想要的东西有差距,我想得到的是最后能把所有的返回封在一个变量里,然后进行模板解析:只要用全局变量就可以解决。
      

  13.   

    如果只是实现简单的树型菜单那是很容易的,但是我要的不是一个树型菜单,而只是当前文章的上n级目录的名,一般来说递归是只能取得最的结果的,如果我只要最后的结果那就不用递归了。在查询语句中加group by怎么加呀,这个我真的是不懂。用全局变量,这个我也不太懂,我只知道它的作用域能大一点之外没有别的什么功能了吧,难道能记录每一次的递归结果?
    我是那种很菜型的,还望高手们能说得比较详细,谢谢!
      

  14.   

    现在有一个新的想法,是用一个递归+二维数组来实现,
    每传入一个新的值,我就把旧的值写到数组中,数组反向,最后用foreach把数组的值取到,再字符串连接。
    有没有高手能写出这样一个函数呀。
      

  15.   

    先看书吧!!mysql+php你都很需要!
      

  16.   

    对了,提一下GROUP BY 是用来计算某个类型的数据在一张表中出现的频度的,不是用来排序的吧?排序是用order by 吧?
      

  17.   

    这是我写的函数,大家看一下有没有什么问题呀?
    function get_nav($cateid,$i=0){
    global $cat_array,$nav;
    $nav[$depth]["navid"]=$cat_array[$cateid]["cateid"];
    $nav[$depth]["navtitle"]=$cat_array[$cateid]["name"];
    if ($cat_array[$cateid]["fid"]!=0){
    get_nav($cat_array[$cateid]["fid"],$i+1);echo "good";
    }
    return $nav;
    }
      

  18.   

    问题成功解决。我把我写的导航栏函数贴出来,大家看看吧!//导航
    function get_nav($cateid,$i=0){
    global $cat_array,$nav;
    $sql="select * from category where cid=$cateid";
    $result=mysql_query($sql);
    $cat_array=mysql_fetch_array($result); $n_cid=$cat_array[cid];
    $n_name=$cat_array[name];
    $n_fid=$cat_array[fid]; $nav[$i]["navid"]=$n_cid;
    $nav[$i]["navtitle"]=$n_name;
    $nav[$i]["fid"]=$n_fid;
    if ($nav[$i]["fid"]>=1){
    get_nav($nav[$i]["fid"],$i+1);
    }
    return $nav;
    }使用办法
    $navarray=get_nav($cid,0);
    echo "$position";
    $rearray=array_reverse($navarray,true);foreach ($rearray AS $navs) {
    $position1.="<a href=show_category.php?cid=$navs[navid]&&fid=$navs[fid]>$navs[navtitle]</a>";
    $position1.=(($navs[navid]==$cid)? "":">>");
    /*end foreach*/

    }
    $position1.="$array[name]";
    $t->set_var("position", $position1);感谢多位高手的指点。散分!