Mysql / php树导航菜单

时间:2012-06-07 06:03:28

标签: php mysql menu tree navigation

需要代码输出:

视觉输出:

我的sql数据库'test'

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `link` varchar(100) NOT NULL,
  `parrent_id` int(11) NOT NULL DEFAULT '0',
  `status` varchar(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `menu`
--

INSERT INTO `menu` (`id`, `name`, `link`, `parrent_id`, `status`) VALUES
(1, 'Home', '#home', 0, 'Show'),
(2, 'About', '#about', 0, 'Show'),
(3, 'Our services', '#service', 0, 'Show'),
(4, 'Get involved', '#getinvolved', 0, 'Show'),
(5, 'Donors', '#donors', 0, 'Show'),
(6, 'News', '#news', 0, 'Show'),
(7, 'Contact Us', '#contact', 0, 'Show'),
(8, 'Ourselves', '#ourselves', 2, 'Show'),
(9, 'Objectives', '#objectives', 2, 'Show'),
(10, 'Our Patrons', '#patrons', 2, 'Show');

我的PHP代码在这里......

<?php
  $dbuser="root";
  $dbpass="";
  $dbname="test";  //the name of the database
  $chandle = mysql_connect("localhost", $dbuser, $dbpass)
    or die("Connection Failure to Database");
  mysql_select_db($dbname, $chandle) or die ($dbname . " Database not found. " . $dbuser);

  function menu($parrent) {
    echo "<ul>";
    $sql = "SELECT * from menu where parrent_id=".$parrent;
    while($res = mysql_fetch_array(mysql_query($sql)))
    echo "<li><a href='".$res['link']."'>".$res['name']."</a></li>";
    echo "</ul>";
  }
  $sql = "SELECT * from menu where parrent_id =0";
  echo "<ul>";
  while($resnew = mysql_fetch_array(mysql_query($sql)))
  {
    $sql_sub = "SELECT * from menu where parrent_id=".$resnew['id']; 
    $count = mysql_num_rows(mysql_query($sql_sub));
    if($count>0)
    {
      echo "<li><a href='".$resnew['link']."'>".$resnew['name']."</a>";   
      menu($resnew['id']);
      echo "</li>";
    }
    else
    {
      echo "<li><a href='".$resnew['link']."'>".$resnew['name']."</a></li>";
    }
  }
  echo "</ul>";
?>

3 个答案:

答案 0 :(得分:0)

尝试此查询,这称为半连接

select
  l.id,
  l.name,
  group_concat(r.name)
from menu l
inner join menu r
on r.parrent_id = l.id
group by l.name

您还可以根据您的要求提供where条件以获得结果,如果父ID不为0,它将带来所有结果。 如何使用Group Concat Value 使用php explode函数来实现这个目的。

答案 1 :(得分:0)

菜单树

一个。创建表“categorylist”。

CREATE TABLE IF NOT EXISTS `categorylist` (
`id` int(5) NOT NULL auto_increment,
`cname` varchar(25) collate utf8_unicode_ci default NULL,
`pid` int(5) NOT NULL,
`url` text collate utf8_unicode_ci,
`status` int(1),
PRIMARY KEY (`id`),
KEY `pid` (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

湾在“categorylist”中插入值

INSERT INTO `categorylist` (`id`, `cname`, `pid`, `url`, `status`) VALUES
(1, 'Entertainment', 0, '#',1),
(2, 'Movies', 1, 'http://example.com/movie.php',1),
(3, 'Drama', 1, 'http://example.com/drama.php',1),
(4, 'Sports', 0, '#',1),
(5, 'Football', 4, 'http://example.com/football.php',1),
(6, 'Cricket', 4, 'http://example.com/cricket.php',1),
(7, 'Politics', 0, '#',1),
(8, 'Politics news', 7, 'http://example.com/politics-news.php',1);

℃。样式表

.nav ul li { background:#f1f1f1; list-style: none;}
ul.dropdown { position:relative; width:auto; font:12px Arial, Helvetica, sans-serif; }
ul.dropdown li { float:left; zoom:1; height:30px; padding:6px 2px 0 2px; }
ul.dropdown li li { border-right:1px solid #ccc; border-left:1px solid #ccc; margin-left:-30px;}
ul.dropdown a:hover { color:#000; } ul.dropdown a:active { color:#ffa500; }
ul.dropdown li a { display:block; padding:4px 8px; color:#000; text-decoration:none; font:bold 12px Arial, Helvetica, sans-serif; }
ul.dropdown li:last-child a { border-right:none;} /* Doesn't work in IE */
ul.dropdown li:hover { color:#000; background:#e7e7e7; position:relative; }
ul.dropdown li.hover a { color:#000; }
ul.dropdown ul { text-align:left; visibility: hidden; position: absolute; left:-10px; top:36px; }
ul.dropdown ul li { background:#f1f1f1; border-bottom:1px solid #ccc; float:none; width:120px; height:25px; }
ul.dropdown ul li a { border-right:none; width:100%; display:inline-block; color:#000; }
ul.dropdown ul ul { left:100%; top:0; }
ul.dropdown li:hover > ul { visibility:visible; }

d。菜单脚本代码

<?php

$con=mysql_connect("localhost", "root", "") or die('Server connexion not possible.');
mysql_select_db("newone",$con) or die('Database connexion not possible.');

$qry="SELECT * FROM categorylist" where status=1;
$result=mysql_query($qry,$con);


$arrayMenu = array();

while($row = mysql_fetch_assoc($result)){
$arrayMenu[$row['id']] = array("pid" => $row['pid'], "name" => $row['cname'], "url" => $row['url']);
}


//createTree($arrayCategories, 0);

function createTree($array, $curParent, $currLevel = 0, $prevLevel = -1) {

foreach ($array as $categoryId => $category) {

if ($curParent == $category['pid']) {

if($category['pid']==0) $class="dropdown"; else $class="sub_menu";
if ($currLevel > $prevLevel) echo " <ul class='$class'> ";


if ($currLevel == $prevLevel) echo " </li> ";

echo '<li id="'.$categoryId.'" >&lt;a href="'.$category['url'].'"&gt;'.$category['name'].'&lt;/a&gt;';

if ($currLevel > $prevLevel) { $prevLevel = $currLevel; }

$currLevel++;

createTree ($array, $categoryId, $currLevel, $prevLevel);

$currLevel--;
}
</pre>
}

if ($currLevel == $prevLevel) echo " </li> </ul> ";

}
?>

<div class="nav">

<?php
if(mysql_num_rows($result)!=0)
{
php createTree($arrayMenu, 0);
}
?>
</div>

答案 2 :(得分:0)

这是我在Kohana Framework中用ORM编写的。也许它有所帮助。如果没有,请随时受到启发...

public function roleTree(){
    // find topmost nodes
    $roles = ORM::factory('Role')->where('parent_id', '=', '0')->find_all();
    $nodes = array('node' => NULL, 'depth' => 0, 'childs' => array());
    foreach($roles as $role){
        $nodes['childs'][] = array('node' => $role, 'depth' => 1, 'childs' => $this->_roleTree($role, 1));
    }
    return $nodes;
}

private function _roleTree($role, $depth){
    // add child nodes
    $depth ++;
    $roles = ORM::factory('Role')->where('parent_id', '=', $role->id)->find_all();
    $nodes = array();
    if(count($roles)){
        foreach($roles as $role){
            $nodes[] = array('node' => $role, 'depth' => $depth, 'childs' => $this->_roleTree($role, $depth));
        }
        return $nodes;
    }
    return array();
}

它创建了一个奇特的结构但简单的数组...