设一个这样的表
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不同的内容及链接;
}
这样的方法是只查询一次数据库,就可以了.....
更多功能,
就要看你的字段加多少了...
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不同的内容及链接;
}
这样的方法是只查询一次数据库,就可以了.....
更多功能,
就要看你的字段加多少了...
function outMenu($fid)
{
if(null == $fid) $fid =0;
//列出fid为$fid的数据
if(cid是否有子级)
{
输出菜单项
outMenu($cid);
}
else
输出菜单项
}
cid中的数值实际上已经是在对数据进行分类了,但是要获得这样的一组分类id我还得再写一个程序,由于我很懒,所以我也就懒得去写这样一个字符串处理程序。所以其不可行。
另外随着分类的细化,cid会越来越长,虽然只有一次查询却要查找老长一段cid容易出错不说,光效率就值得商榷了。个人看法,呵呵!用递归来实现我觉得倒是可行,我试着写一下,如果写不出来再向高手们请教。
一个导航用for语句进行数据库查询,
对mysql的压力是相当大的...做一个好的后台,
请前台更轻松些.....哈哈~~
对了,下面是我写的递归,但有一点问题。
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.=" <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=">> <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 " fid=$nfid ";
$p1="<a href=show_category.php?cid=$cid&&fid=$fid>$cname</a>";
}
/*end while*/;
}
Return $p1;
}它能够输出所有的栏目,但是输出时多了一些东西。当栏目多于三级时,结果是:
b1 b1 B 伊拉克 时事新闻
b1重复了一次。如何把这个重复项去掉,而且最后的数据要卦装到一个变量中,现在也做不到,只能echo出来。我认为这个递归的结束条件是在当前目录里找不到一个fid等于其cid。不知我的看法是否正确。
还望高手们指教!
解决了问题的高手定送高分哟,其实分倒不是最主要的,能从这个问题中得到一种思路才重要。Do u think so?
# 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;
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);
}
}
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;
}
数据如下:
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.
我是江郎才尽了,没有办法做到。请教高手们啦。尽量不改数据库结构!
我是那种很菜型的,还望高手们能说得比较详细,谢谢!
每传入一个新的值,我就把旧的值写到数组中,数组反向,最后用foreach把数组的值取到,再字符串连接。
有没有高手能写出这样一个函数呀。
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;
}
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);感谢多位高手的指点。散分!