Blogger Information
Blog 263
fans 3
comment 2
visits 113274
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP无限分类
福哥的博客
Original
1197 people have browsed it

什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

所需PHP文件

conn.php    数据库配置文件

deep.php    递归无限极分类文件

deep2.php   导航link式文件

建立数据库表


分类表:命名为deepcate

1480556176269506.png

数据库准备: 

建表deepcate:

CREATE TABLE IF NOT EXISTS `deepcate` (
`id` int(4) NOT NULL,
`pid` int(11) NOT NULL,
`catename` varchar(30) NOT NULL,
`cateorder` int(11) unsigned NOT NULL DEFAULT '0',
`createtime` int(10) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='分类表';

导入***数据:

INSERT INTO `deepcate` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES
(1, 0, '新闻', 0, 0),
(2, 0, '图***', 0, 0),
(3, 1, '国内新闻', 0, 0),
(4, 1, '国际新闻', 0, 0),
(5, 3, '北京新闻', 0, 0),
(6, 4, '美国新闻', 0, 0),
(7, 2, '美女图***', 0, 0),
(8, 2, '风景图***', 0, 0),
(9, 7, '欧美明星', 0, 0),
(10, 9, '英国***', 0, 0);

配置连接文件

新建文件conn.php

<?php
 $db_host='localhost';
 $db_user='root';
 $db_password = '';
 $db_name = '';
 $link=@mysqli_connect($db_host,$db_user,$db_password)or die(mysql_error());
 mysqli_select_db($link,$db_name)or die(mysqli_error());
 mysqli_query("$link,set names utf8")or die('编码设置错误');
?>

实现原理图

123.png

下拉列表样式


<?php
include ("conn.php");
//首先定义一个函数,pid作为父类ID,定义为0
function getList($pid=0,&$result=array(),$space=0){//递归在***作是需要返回数组,我们使用引用的方法,对代码进行更改
 $space=$space+2;
 $sql="SELECT*FROM deepcate WHERE pid = $pid";//使用sql语句,查询pid选面的子类。
 $res = mysql_query($sql);//把结果放入数组中,然后返回到result中。
 while ($row = mysql_fetch_assoc($res)){
 $row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];//对分类的样式进行美化
 $result[]=$row;
 getList($row['id'],$result,$space);//递归是函数自身调用自身的技巧,我们在查询子类 的 时候需要调用到getList($row['id']);
 }//子类的ID要作为下一级的ID所以要在后面带入$row['id'])
 return $result;
}
$rs=getList();
function displayCate($pid=0,$selected=1){
 $rs=getList($pid);
 $str='';
 $str.="<select name='cate'>";
 foreach ($rs as $key=>$val){
 $selectedstr='';
 if ($val['id'] == $selected){
 $selectedstr="selected";
 }
 $str.="<option{$selectedstr}>{$val['catename']}</option>";
 }
 return $str.='</select>';
}
echo displayCate(0,2);
?>

要点:

  1. 递归实现无限级分类是用利用递归方式,找出父节点,生成一个家谱树。

  2. 子类与父类。

1477708200951766.png

导航LINK样式

<?php
include('conn.php');
function getCatePath($cid, &$result = array()) {
/*同下拉样式相同,创建getCatePath函数,执行sql语句查询id,并把取得的付给$rs.
使用mysql_fetch_assoc来获取数组,调用自身getCatePath把pid和自身的id进行查询。*/
 $sql = "SELECT * FROM deepcate WHERE id=$cid";
 $rs = mysql_query($sql);
 $row = mysql_fetch_assoc($rs);
 if ($row) {
 $result[] = $row;
 getCatePath($row['pid'], $result);
 }
 krsort($result); //返回$result,使用逆向的方式对数组进行排序。
 return $result;
}
function displayCatePath($cid,$url='cate.php?cid=') {
 $res = getCatePath($cid);
 $str = '';
 foreach ($res as $key => $val) {
 $str.= "<a href={$url}{$val['id']}>{$val['catename']}</a>>";
 }
 return $str;
}
echo displayCatePath(10);
?>

要点:

1.link样式是从父节点开始,向下寻找其子孙节点,而形成的一个树状图形,link样式判断的是当前节点的pid与上一个节点的id相等.

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post