我想用php mysql 实现无限级目录
数据库中的category字段
classId className upperId
我想实现的效果描述如下:
网页的左边显示目录首先 显示第一级目录
然后点击一级目录显示二级目录 点击二级目录显示对应的三级目录。
当二级目录被展开的后 点击一级目录的另外一个目录名 一级目录全部隐藏 只显示一级目录名
而且每次点击目录之后 整个网页刷新 用来获取id(不用ajax实现)我做的是三个while
点击一级目录 保存一级目录的id 显示二级目录 
点击二级目录 保存一级和二级的目录id 显示三级目录
1111111111
  11111111
    111111
2222222222
3333333333
4444444444点击22222222后 显示
1111111111
2222222222
  22222222
3333333333
4444444444
点击22222222 显示1111111111
2222222222
  22222222
    222222
3333333333
4444444444只能用一个网页写 每次刷新

解决方案 »

  1.   

    旧调重弹, 给你个例子,照 着改吧:#sql
    CREATE TABLE `tree` (
      `id` int(11) NOT NULL,
      `name` varchar(255) collate utf8_bin NOT NULL,
      `parent` int(11) NOT NULL,
      `ischild` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    PHP code
    <?php
    header("content-type: text/html; charset=utf-8");
    $connect = mysql_connect('localhost', 'root', '123456');
    mysql_select_db("wz");
    mysql_query("set names 'utf8'");
    //获得顶节点
    $sql = "select id, name,ischild from tree where parent = 0 order by id asc";
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result))
    {
        extract($row);
            //如果有子节点,就在前面加个事件,以便展开或者关闭子节点
        $icon = $ischild ? "<a href='javascript:expand(\"div$id\");'>+</a>":"-";
        $name = $icon . $name;
        echo "<div id='div" . $id . "'>" . $name;
        if($ischild)
        {
                    //递归获取节点
            getNode($id, 0);
        }
        echo "</div>";
    }function getNode($id, $level)
    {
        $sql = "select id, name, ischild from tree where parent = $id order by id asc ";
        $result = mysql_query($sql);
        $level++;
      while($row = mysql_fetch_array($result))
      {
          extract($row);
            $icon = $ischild ? "<a href='javascript:expand(\"div$id\");'>+</a>":"-";
            $name = $icon . $name;  
            echo "<div id='div" . $id . "'>" . echoChar("&nbsp;&nbsp;&nbsp;&nbsp;", $level)  . $name;
            if($ischild)
            {
                getNode($id, $level);
            }
            echo "</div>";
      }
    }function echoChar($char, $num)
    {
        for($i=0;$i< $num; $i++)
        {
            $strChar .= $char;
        }
        return $strChar;
    }
    ?>
    <script language="javascript">
        function expand(id)
        {
            var obj = document.getElementById(id).childNodes;
            for(var i=0;i<obj.length;i++)
            {
                if(obj[i].nodeName == "DIV")
                {
                    switch(obj[i].style.display)
                    {
                        case "":
                        case "block":
                         obj[i].style.display = "none";
                         break;
                        case "none":
                         obj[i].style.display = "block";
                         break; 
                    }
                }
            }
        }
    </script>
      

  2.   

    PHP无限目录
      

  3.   

    lz你看看这个,对你有帮助:
    [PHP设计模式]Composite(组合)模式范例
      

  4.   


    首先 我做的是二次开发 数据库规定不能修改
    数据库中是无法添加ischild字段的,还有第一次展开的时候只显示一级目录
    不过你给了想法 应该可以实现 我在你的基础上修改看看
      

  5.   

    这个应该是用CSS加JAVASCRIPT来控制:
    <div id="a1" ><span  onClick="isshow('a1')" style="color:#FF0000; cursor:pointer">非常</span>
    <div>11111</div>
    <div>22222</div>
    <div>33333</div>
    </div>
    <div id="a2" ><span onClick="isshow('a2')" style="color:#FF0000;cursor:pointer">讨厌</span>
    <div>44444</div>
    <div>55555</div>
    <div>66666</div>
    </div>
    <div id="a3"><span onClick="isshow('a3')" style="color:#FF0000;cursor:pointer">星期一</span>
    <div>77777</div>
    <div>88888</div>
    <div>99999</div>
    </div>
    <script>
    function ine(){
    for(var j=1;j<=3;j++)
    {for(var i=0;i<document.getElementById("a"+j).getElementsByTagName("div").length;i++)
    {document.getElementById("a"+j).getElementsByTagName("div")[i].style.display="none"}}
    }
    function isshow(e)
    {ine()
    for(var i=0;i<document.getElementById(e).getElementsByTagName("div").length;i++)
    document.getElementById(e).getElementsByTagName("div")[i].style.display=""}
    ine();
    </script>
      

  6.   

    我的例子,数据库和1楼差不多,不过只有parent字段,没有ischild字段。主要思想就是递归或者说是堆栈,我用的是堆栈。一套算法,自己拿起纸和笔去实现,经典的实例,很有成就感的。function getTypeMenuArray($rsAssoc,$fatherId=false){
    if ($fatherId) {
    $this->findById=$fatherId;
    }
    //$menuArray数组生成以后停止循环。
    $stack=array();
    $="";//父子元素之间的标记
    $temp="";
    while (count($rsAssoc)) {
    //查找指定fatherId的所有子类型
    if ($fatherId and count($stack)==0) {
    $temp=$this->findInArr($rsAssoc,$fatherId);
    if ($temp) {
    array_push($stack,$temp);
    $this->addMenuArrayElt($temp);
    unset($rsAssoc[$temp['id']]);
    $="";
    continue;
    }
    else break;
    }
    //如果堆栈没有内容,从$rsAssoc读取一个fatherId=0的元素
    elseif (count($stack)==0 and $fatherId==false) {
    $temp=$this->findInArr($rsAssoc,0);
    array_push($stack,$temp);
    $this->addMenuArrayElt($temp);
    unset($rsAssoc[$temp['id']]);
    $="";
    continue;
    }
    //否则,查找栈顶元素是否有子类型
    if ($temp=$this->findInArr($rsAssoc,$stack[count($stack)-1]['id'])) {//有子类型,进栈
    $.="--";
    $temp['name']=$.$temp['name'];
    array_push($stack,$temp);
    $this->addMenuArrayElt($temp);
    unset($rsAssoc[$temp['id']]);
    }
    else {//没有子类型,叶子出栈
    $=substr($,0,strlen($)-2);
    array_pop($stack);

    }
    }
    return $this->menuArray;
    }
    }
      

  7.   

    漏了个函数
    function findInArr($arr,$fVal){
    foreach ($arr as $value) {
    if ($value['fatherId']==$fVal) {
    return $value;
    }
    }
    return false;
    }
      

  8.   

    如果目录是静态的话不是很难,JS就能实现...但是要从数据库读出数据实现动态目录的话...推荐ajax了..我最近也为了这个再学习ajax
      

  9.   

    以前jakey9826高人写过个无限极目录的例子。网址忘记了。给你个列子。<?php
    header("content-type: text/html; charset=gb2312");
    $connect = mysql_connect('localhost', 'root', '');
    mysql_select_db("xxx");
    mysql_query("set names 'gb2312'");
    //获得顶节点
    $sql = "select id, name,ischild from tree where parent = 0 order by id asc";
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result))
    {
        extract($row);
            //如果有子节点,就在前面加个事件,以便展开或者关闭子节点
        $icon = $ischild ? "<a href='javascript:expand(\"div$id\");'>+</a>":"-";
        $name = $icon . $name;
        echo "<div id='div" . $id . "'>" . $name;
        if($ischild)
        {
                    //递归获取节点
            getNode($id, 0);
        }
        echo "</div>";
    }function getNode($id, $level)
    {
        $sql = "select id, name, ischild from tree where parent = $id order by id asc ";
        $result = mysql_query($sql);
        $level++;
    while($row = mysql_fetch_array($result))
    {
      extract($row);
        $icon = $ischild ? "<a href='javascript:expand(\"div$id\");'>".$name."</a>":"-";
        $name = $ischild ? "+".$icon : "-".$name;
        echo "<div id='div" . $id . "' class='menu'>" . echoChar("&nbsp;&nbsp;", $level)  . $name;
        if($ischild)
        {
            getNode($id, $level);
        }
        echo "</div>";
    }
    }function echoChar($char, $num)
    {
        for($i=0;$i< $num; $i++)
        {
            $strChar .= $char;
        }
        return $strChar;
    }
    ?>
    <style type="text/css">
    .menu{
    CURSOR: hand;
    TEXT-DECORATION: none;
    }
    </style>
    <script type="text/javascript">
    function expand(id)
    {
        var obj = document.getElementById(id).childNodes;
        for(var i=0;i<obj.length;i++)
        {
            if(obj[i].nodeName == "DIV")
            {
                switch(obj[i].style.display)
                {
                    case "":
                    case "block":
                     obj[i].style.display = "none";
                     break;
                    case "none":
                     obj[i].style.display = "block";
                     break; 
                }
            }
        }
    }
    </script>数据库--CREATE TABLE `tree` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(255) collate utf8_bin NOT NULL,
      `parent` int(11) NOT NULL,
      `ischild` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    )多加个是否有子结点的字段。有助于判断。不加也可以。浪费资源。
    用ext的tree也容易实现,还好看些