为什么要建两个表呢?在一个表内就可以做出来了呀,一个产品类有一个父id,一个子id,从属关系即可确定。对应查找就可以了。

解决方案 »

  1.   

    给你看看这个类表
    CREATE TABLE `web_board` (
    `boardid` tinyint(4) unsigned NOT NULL auto_increment,
    `boardname` varchar(20) NOT NULL default '',
    `boardnick` varchar(20) NOT NULL default '',
    `p_b_id` tinyint(4) unsigned NOT NULL default '0',
    UNIQUE KEY `boardid` (`boardid`,`boardname`)
    ) TYPE=MyISAM AUTO_INCREMENT=19 ;
    可以用其他方式
    文件tree.class.php
    [PHP:--------------------------------------------------------------------------------
    <?php 
    class Tree {
        /*
        *$tree_t $tree_c $tree_l $tree_k够成树状结构的图形
        */
        var $tree_t="┝";//节点,下面还有同深度的节点
        var $tree_c="┕";//节点,下面还没有同深度的节点
        var $tree_l="│";//非节点,过渡,下面有父节点同深度的节点
        var $tree_k="&nbsp;&nbsp;";//非节点,过渡,下面没有父节点同深度的节点
        
        /*
        $tree_f,$tree_a和$tree_m 可以使用[treeid] [ptreeid] [treename] [treenick] [allvalue]
        四个字串代替相应的变量
        */
        var $tree_m="[treename]([treenick])";//主体
        var $tree_f="<option value=[treeid]>";//前缀    
        var $tree_a="</option>";//后缀
        
        /*$outstr 输出树状目录结构的字符串*/
        var $outstr;
        /*设定显示*/
        function setTree ($t,$c,$l,$k,$m,$f,$a){
            if (!empty($t)) {
                $this->tree_t=$t;
            }
            if (!empty($c)) {
                $this->tree_c=$c;
            }
            if (!empty($l)) {
                $this->tree_l=$l;
            }
            if (!empty($k)) {
                $this->tree_k=$k;
            }
            if (!empty($f)) {
                $this->tree_f=$f;
            }
            if (!empty($a)) {
                $this->tree_a=$a;
            }
            if (!empty($m)) {
                $this->tree_m=$m;
            }
        }
        /*检索表生成数组*/
        function _list_tree($table) {
            $query="select * from $table order by p_b_id";
            $result=mysql_query($query);
            while ($row=mysql_fetch_assoc($result)) {
                $arr_tree[$row["p_b_id"]][$row["boardid"]]=$row["p_b_id"]."|".$row["boardid"]."|".$row["boardname"]."|".$row["boardnick"];
            }
            return ($arr_tree);
        }
        /*
        *_echo_o_board($p_b_id,$arrboard,&$q_str,$i)
        *生成树状目录结构
        *$p_b_id 父目录id
        *$arrboard _list_board()生成的数组
        
        *$q_str数组 记录显示树状目录结构$tree_l和$tree_k的数组
        *$i深度
        *$kk同一层内的序号0开始
        *使用递归生成树状结构
        */
        function _echo_o_board($p_t_id,$arrtree,&$q_str,$i) {
            if (is_array($arrtree[$p_t_id])) {
                $len=count($arrtree[$p_t_id]);
                $kk=0;
                foreach($arrtree[$p_t_id] as $key=>$var) {
                    list($ptreeid,$treeid,$treename,$treenick)=explode("|",$var);//分割数组信息
                    /*
                    生成结构
                    */
                    if ($kk<$len-1) {
                        $end_str=$this->tree_t;
                        $q_str[$i]=$this->tree_l;
                    } else {
                        $end_str=$this->tree_c;
                        $q_str[$i]=$this->tree_k;
                    }
                    if ($p_t_id==0) {
                        //检索的是最顶层目录
                        $i=0;
                    }
                    $r_str=array("treeid"=>$treeid,"ptreeid"=>$ptreeid,"treename"=>$treename,"treenick"=>$treenick,"allvalue"=>$var);
                    $this->outstr.=$this->_replace($this->tree_f,$r_str);
                    for ($k=0;$k<$i;$k++) {
                        $this->outstr.=$q_str[$k];
                    }
                    $this->outstr.=$end_str;
                    $this->outstr.=$this->_replace($this->tree_m,$r_str);
                    $this->outstr.=$this->_replace($this->tree_a,$r_str);
                    $i++;
                    $this->_echo_o_board($key,$arrtree,&$q_str,$i);
                    $kk++;//移到下一个
                    $i--;//恢复$i
                    /*
                    生成结构完成
                    */
                }
            } else {
                /*检索到最底层返回*/
                return;
            }
        }
        /*置换定义的字串*/
        function _replace($str,$r_str) {
            foreach ($r_str as $key=>$var) {
                $str=str_replace("[$key]",$var,$str);
            }
            return($str);
        }
        /*echo_tree()显示树状目录*/
        function echo_tree() {
            echo $this->outstr;
        }
        /*
        *list_select_tree()和list_tree()是两个默认的树状目录结构
        */
        function list_select_tree() {    
            $table=s_table_n("board");
            $arrboard=$this->_list_tree($table);
            $this->outstr="<select name=p_b_id class=boardsele>";
            $this->outstr.="<option value=0><--顶层板块--></option>";
            $this->_echo_o_board(0,$arrboard,$q_str,0);
            $this->outstr.="</select>";
            return ($outstr);
        }
        
        function list_tree() {
            $table=s_table_n("board");
            $arrboard=$this->_list_tree($table);
            $t="<img src=./images/tree_t.gif align=absmiddle  width=20 height=20>";
            $c="<img src=./images/tree_c.gif align=absmiddle  width=20 height=20>";
            $l="<img src=./images/tree_l.gif align=absmiddle  width=20 height=20>";
            $k="☆";//"<img src=./images/tree_k.gif align=absmiddle  width=20 height=20>";
            $m="<input type=\"radio\" name=\"board\" value=\"[allvalue]\"  width=20 height=20>[treename]([treenick])";
            $f="【★】";
            $a="<br>\n";
            $this->setTree ($t,$c,$l,$k,$m,$f,$a);
            $this->_echo_o_board(0,$arrboard,$q_str,0);
        }    
    }?>