对于一个导航栏设计的思考。

ustb 2003-05-02 03:25:13
这是一个新闻网站的导航栏。
站内栏目动态添加,可无限分类。数据库中的表结构如下。

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

处理导航的程序我现在是这样写的。
include "../nav.php";
$sql="select name,fid from category where cid=$cid";//从分类表中找出cid等于传来的参数cid的数据
$result=mysql_query($sql);
$array=mysql_fetch_array($result);
$cname=$array["name"];
$nfid=$array["fid"];
echo "fid=$fid ";
$p1=" <a href=show_category.php?cid=$cid&&fid=$nfid>$cname</a>";


//如果栏目多于一级
if($fid>"1") {

$sql="select name,fid from category where cid=$fid";//找上一级
$result=mysql_query($sql);
$array=mysql_fetch_array($result);
$cname=$array["name"];
$uid=$array["fid"];
$p1=$p1."<a href=show_category.php?cid=$fid&&fid=$uid>$cname</a>";//变量p,找到本类名
echo "uid=$uid ";

$sql2="select name,cid from category where cid=$cid";//找本级栏目
$result2=mysql_query($sql2);
$array2=mysql_fetch_array($result2);
$sid=$array2["cid"];
$cname=$array2["name"];
echo "uid=$uid ";
echo "cid=$cid";
$p1.=">> <a href=show_category.php?cid=$sid&&fid=$fid>$cname</a>";
}
/*end if*/

$position=$p1;//最后所有的栏目名放到$position中


nav.php是每个页面都要用到的一个导航。它给出二级页面的初始cid和fid

现在只能显示本级目录和上一级目录,多于三级之后,就无法显示第一级了。
也就是说
只有一个级: 栏目
二个级: 栏目>>子栏目
三个级:   子栏目>>子子栏目

第一级的:栏目  没有显示。
我的办法只能每两级一显示,有没有办法让有从属关系的栏目全显示。
注意分类是无限的。


...全文
188 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ustb 2003-05-06
  • 打赏
  • 举报
回复
这是我写的函数,大家看一下有没有什么问题呀?
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;
}
ustb 2003-05-06
  • 打赏
  • 举报
回复
我给分了呀,怎么没有显示呢!
ustb 2003-05-06
  • 打赏
  • 举报
回复
问题成功解决。我把我写的导航栏函数贴出来,大家看看吧!

//导航
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);

感谢多位高手的指点。散分!
wsrboy 2003-05-05
  • 打赏
  • 举报
回复
笔误!!
wsrboy 2003-05-05
  • 打赏
  • 举报
回复
先看书吧!!mysql+php你都很需要!
ustb 2003-05-05
  • 打赏
  • 举报
回复
现在有一个新的想法,是用一个递归+二维数组来实现,
每传入一个新的值,我就把旧的值写到数组中,数组反向,最后用foreach把数组的值取到,再字符串连接。
有没有高手能写出这样一个函数呀。
ustb 2003-05-05
  • 打赏
  • 举报
回复
如果只是实现简单的树型菜单那是很容易的,但是我要的不是一个树型菜单,而只是当前文章的上n级目录的名,一般来说递归是只能取得最的结果的,如果我只要最后的结果那就不用递归了。在查询语句中加group by怎么加呀,这个我真的是不懂。用全局变量,这个我也不太懂,我只知道它的作用域能大一点之外没有别的什么功能了吧,难道能记录每一次的递归结果?
我是那种很菜型的,还望高手们能说得比较详细,谢谢!
ustb 2003-05-05
  • 打赏
  • 举报
回复
对了,提一下GROUP BY 是用来计算某个类型的数据在一张表中出现的频度的,不是用来排序的吧?排序是用order by 吧?
ustb 2003-05-05
  • 打赏
  • 举报
回复
推荐两本好书吧!
不过能马上解决问题就更好了。
ustb 2003-05-04
  • 打赏
  • 举报
回复
有点说明错误,应当是cid=5 fid=2和 cid=6 fid=2的数从属于cid=2 fid=1 的数。
ustb 2003-05-04
  • 打赏
  • 举报
回复
其实现在返回的$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.
我是江郎才尽了,没有办法做到。请教高手们啦。尽量不改数据库结构!
ustb 2003-05-04
  • 打赏
  • 举报
回复
不是吧,还要加字段,两个字段还不能确定从属关系吗?

这是我今天写的,他可以完整的实现从属关系,但有两个问题,一是排序反了,二是跟我想要的东西有差距,我想得到的是最后能把所有的返回封在一个变量里,然后进行模板解析。如果只能递归输出那也太·%#·¥·#%了吧。有没有办法实现我每给他一个新值,自动加上上一次输出的结果变量,如果能,如何实现;如果不能,为什么?
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="<< <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;

}
wsrboy 2003-05-04
  • 打赏
  • 举报
回复
随手写的没测试
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 " fid=$nfid ";
$p1="<a href=show_category.php?cid=$cid&&fid=$fid>$cname</a>";
//你可以用个字段来标记是否有子菜单
/*
if(cid是否有子级)
{
outMenu($cid);
}
*/
outMenu($cid);
}



}
ustb 2003-05-04
  • 打赏
  • 举报
回复
# 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,
mark 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;

wsrboy 2003-05-04
  • 打赏
  • 举报
回复
好好看书吧!!一是排序反了:如果是数据排序反了只要在查询语句加GROUP BY;如果你想通过子栏目找父栏目的话,你稍做修改就可以了,也不用那么麻烦的。二是跟我想要的东西有差距,我想得到的是最后能把所有的返回封在一个变量里,然后进行模板解析:只要用全局变量就可以解决。
xqi8 2003-05-03
  • 打赏
  • 举报
回复
楼上的 ,你的数据库结构呢,在哪里?
ustb 2003-05-03
  • 打赏
  • 举报
回复
给大家提供一个源代码的下载地址:

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?

ChinaZhuhai 2003-05-03
  • 打赏
  • 举报
回复
你都写这么多了...

小问题你一定可以自己搞定...

我现在是看不明白了...哈哈~~水平太低了

或 你把你的源程序(全部,保密的改动一下)提供个下载地址...

这样大家一搞就行了...
ChinaZhuhai 2003-05-02
  • 打赏
  • 举报
回复
其实提供你的想法只是我在实际应用的心得而已,
一个导航用for语句进行数据库查询,
对mysql的压力是相当大的...

做一个好的后台,
请前台更轻松些.....哈哈~~
ustb 2003-05-02
  • 打赏
  • 举报
回复
珠海的办法有问题呀
cid中的数值实际上已经是在对数据进行分类了,但是要获得这样的一组分类id我还得再写一个程序,由于我很懒,所以我也就懒得去写这样一个字符串处理程序。所以其不可行。
另外随着分类的细化,cid会越来越长,虽然只有一次查询却要查找老长一段cid容易出错不说,光效率就值得商榷了。个人看法,呵呵!

用递归来实现我觉得倒是可行,我试着写一下,如果写不出来再向高手们请教。
加载更多回复(4)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧