PHP代码部分: //无限分类-使用路径
//原理:通过路径来进行拆分得到所有想得到的pid以及id,路径是在设计表时的一个字段,包含着从祖先id到父id的一系列id
//该方法,不论查看或者是删除等其他操作,都只需要执行一次sql语句就能够达到想要的效果
//该种方法也是本人比较喜欢的使用的啦,因为我的原则是能够不使用递归,就坚决不用递归
$link=mysql_connect('localhost','username,'password');
if(mysql_errno()){
echo '数据库连接失败:'.mysql_error();
}
mysql_select_db('db_kind');
mysql_set_charset('utf8');
//concat(),连接字符串成一个新字符串
//下面的代码完成一个无限分类的现实
$sql="select concat(path,'-',id) as conpath,id,name,path from wx_kind order by conpath";
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
$arr=array();
//这里可以选择对path字段或者新组成的conpath字段来进行字符串的拆分
//对于explode()函数注意一点,无论要拆分的字符串是否包含使用参数的字符,都至少返回包含一个元素的数组
$count=count(explode('-',$row['path']))-1;
//str_repeat(),对字符串进行重复,主要是为了格式看的比较清楚
$str=str_repeat(' ',$count);
echo $str.$id.'=>'.$row['name'].'<hr/>';
}
/***********************************
如果现在需要进行删除操作,同样使用路径
例如现在要删除雷霆这个分类
首先根据其id找到路径
**************************************/
/* $sql1="select id,path from wx_kind where id=20";
$result1=mysql_query($sql1);
$row=mysql_fetch_assoc($result1);
$id=$row['id'];
$path=$row['path'];
//构造出以该分类作为父类或者祖先分类的所有path
$new_path=$path.'-'.$id;
//下面就可以进行删除动作了
$sql2="delete from wx_kind where id={$id} or path like '{$new_path}%'";
$result2=mysql_query($sql2);
if($result2 && mysql_affected_rows()){
echo '删除成功!';
}else{
echo '删除失败!';
} */
/*****************************************************/
//使用递归函数的方法,不解释那么多了,直接看代码吧,主要就是查找的方式不一样
function display_classify($pid=0,$num=0){
$sql="select id,name from wx_kind where pid={$pid}";
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
$id=$row['id'];
$str=str_repeat(' ',$num);
echo $str.$id.'=>'.$row['name'].'<hr/>';
display_classify($id,$num+1,$sid);
}
}
//display_classify();
/*****************************************************/
//以下就是删除的方法了,慢慢看吧主要就是下面说的删除时的顺序,和应该在哪进行删除要注意一下
function del_classify($id){
//先使用递归来找出已该id为父id或祖先id的所有的子分类,然后依次从里到外进行删除操作,注意删除时的顺序
$sql="select id,name from wx_kind where pid={$id}";
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
$id=$row['id'];
del_classify($id);
}
//删除操作在循环外执行
$sql1="delete from wx_kind where id={$id}";
//直接进行删除,而不是任何提示
$result=mysql_query($sql1);
if(!($result && mysql_affected_rows())){
$bool=false;
}else{
$bool=true;
}
return $bool;
}
//del_classify(5);
以下是数据库代码:
--
-- 数据库: `db_kind`
--
-- --------------------------------------------------------
--
-- 表的结构 `wx_kind_dump`
--
CREATE TABLE `wx_kind_dump` (
`id` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL,
`name` char(40) NOT NULL,
`path` char(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;
--
-- 导出表中的数据 `wx_kind_dump`
--
INSERT INTO `wx_kind_dump` VALUES (1, 0, '新闻', '0');
INSERT INTO `wx_kind_dump` VALUES (2, 0, '视频', '0');
INSERT INTO `wx_kind_dump` VALUES (3, 0, '图片', '0');
INSERT INTO `wx_kind_dump` VALUES (4, 0, '读书', '0');
INSERT INTO `wx_kind_dump` VALUES (5, 1, '政治新闻', '0-1');
INSERT INTO `wx_kind_dump` VALUES (6, 1, '财经新闻', '0-1');
INSERT INTO `wx_kind_dump` VALUES (7, 1, '娱乐新闻', '0-1');
INSERT INTO `wx_kind_dump` VALUES (8, 1, '体育新闻', '0-1');
INSERT INTO `wx_kind_dump` VALUES (9, 8, '篮球', '0-1-8');
INSERT INTO `wx_kind_dump` VALUES (10, 8, '足球', '0-1-8');
INSERT INTO `wx_kind_dump` VALUES (11, 8, 'F1', '0-1-8');
INSERT INTO `wx_kind_dump` VALUES (12, 8, '网球', '0-1-8');
INSERT INTO `wx_kind_dump` VALUES (13, 9, '国际篮球', '0-1-8-9');
INSERT INTO `wx_kind_dump` VALUES (14, 9, 'CBA', '0-1-8-9');
INSERT INTO `wx_kind_dump` VALUES (15, 9, 'CUBA', '0-1-8-9');
INSERT INTO `wx_kind_dump` VALUES (16, 9, 'NBA', '0-1-8-9');
INSERT INTO `wx_kind_dump` VALUES (17, 9, 'NCAA', '0-1-8-9');
INSERT INTO `wx_kind_dump` VALUES (18, 16, '热火', '0-1-8-9-16');
INSERT INTO `wx_kind_dump` VALUES (19, 16, '湖人', '0-1-8-9-16');
INSERT INTO `wx_kind_dump` VALUES (20, 16, '雷霆', '0-1-8-9-16');
INSERT INTO `wx_kind_dump` VALUES (21, 16, '凯尔特人', '0-1-8-9-16');
INSERT INTO `wx_kind_dump` VALUES (22, 18, 'James', '0-1-8-9-16-18');
INSERT INTO `wx_kind_dump` VALUES (23, 18, 'Wade', '0-1-8-9-16-18');
INSERT INTO `wx_kind_dump` VALUES (24, 20, 'KD', '0-1-8-9-16-20');
INSERT INTO `wx_kind_dump` VALUES (25, 20, 'WS', '0-1-8-9-16-20');