加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP进阶教程 完成网站的无限分类

发布时间:2022-03-08 11:03:36 所属栏目:PHP教程 来源:互联网
导读:1、分析 我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类: 第一分类(父分类)--第二分类(子分类)--第三分类(孙分类) 这种亲缘分类越多,程序和数据库的控制就越加的复杂困难。在同
  1、分析
 
  我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类:
 
  第一分类(父分类)-->第二分类(子分类)-->第三分类(孙分类)
 
  这种亲缘分类越多,程序和数据库的控制就越加的复杂困难。在同一级的分类处理和控制是非常的简单的,因为只需要一个数据库来记载这一级的分类就行了,如:系统,新闻等分类,在这一级上处理是很简单的,但对一个网站来说一级分类是不够的,还需要再分类,如:
 
  
  困难一:如何在数据库里处理这些互有关联的亲缘分类?
 
  困难二:如何用 php 完成这种一目了然的关系?
 
  这种分级多而细的分类是每个 php 程序员都必须解决的问题,因为制作一个好而出色的网站分类问题是不可避免的,而解决这个问题又是相当复杂的,其中最大的问题就是数据库的分类处理,因为如果数据库处理不当将会带来巨大的工作量甚至是不得不重新规划数据库...
  
  2、数据库的规划
 
  前面谈到分类的复杂性,因此如何规划数据库便成为了实现无限分类非常重要的一步。
 
  我曾介绍过论坛的数据库规划,不错论坛能够实现无限的跟接,无限分类便是这种形式的扩展,分类同样是这种子父的关联关系,所以分类的数据库就是如何确立明确这种子父关系,这里面有几个难点。
 
  1)如何处理各分类的信息存储;
 
  2)如何处理分类的亲缘关系;
 
  3)如何处理对信息的查询;
 
  亲缘关系的数据库处理与论坛的数据库处理类似,这里建个 type 的数据库用来处理分类:
 
  建立字段:
 
  id(int):用来记录各分类的自然序号
 
  uid(int):用来记录该分类的父分类的 id 号
 
  type(char):类别的名称
 
  roue_id(varchar):亲缘树,以 :0:2:10:20: 的 id 连接表明亲源关系
 
  roue_char(varchar):亲缘树,类似 :系统:linux:开发工具:gcc: (这个字段有没有都没关系,为了更方便地了解各亲缘关系当然字符表述比数字表述更直接,不过最好加上这个字段)
  
  剩下的任务就全部交由 php 来处理完成。
 
  3、程序控制
 
  实现无限分类这个功能中就属这一步最为复杂辛苦,首先看看程序需要完成的步骤:
 
  1)创建分类上传;
 
  2)创建信息上传;
 
  3)明确显示各分类及其之间的关系;
 
  4)处理查询功能;
 
  5)如何处理编辑和删除的功能;
 
  而这五步中最为困难的就是第五个步骤,因为对分类的编辑和删除涉及到一至性的问题
 
  下面我就逐一描述 php 的程序控制:
 
  1)创建分类上传
 
  在介绍这个功能前,先介绍一下 explode( ) 这个函数,这是个字串处理函数,用来分解字串的,具体的用法,例:
 
  分解"0:1:2:3:4"里的数字
 
  以下为引用的内容:
  $val='0:1:2:3:4';
  $rid=explode(":",$val);
  经过 explode( ) 函数处理,$val 内的所有数字都分解到 $rid 数组中了,要引用时只需打印:echo '$rid[0],$rid[1],$rid[2]..."; 就行了.explode( ) 函数在整个分类处理中起着非常重要的作用,好现在开始介绍无现分类的程序控制。
 
  可以假设个总分类 0 ,所有的分类都是它的子孙分类,现在来建立第一个分类'系统',来看看它在数据库的存储形式:
 
  id | uid | type | rout_id | rout_char 1 | 0 | 系统 | 0:1 | 系统
 
  接着又在下面分'Linux':
 
  id | uid | type | rout_id | rout_char 2 | 1 | Linux| 0:1:2 | 系统:Linux
 
  以上就是数据库存储的形式,现在就来完成 php 的代码,这与论坛的代码很相似,我们所要做的就是将分类的 id 放入 uid,而父分类的 uid 就放 0,下面来看看代码:
 
  以下为引用的内容:
  <?
  .....
  .....
  //设置默认页
  if (empty($func)) $func=='showtype';
  //设置父分类的 uid
  if (empty($uid)) $uid=0;
  //数据库存储************************************************
  if ($func=='save'):
  $fields = "";
  $values = "";
  if ($id!="") {
  $fields .= ",id";
  $values.=",$id";
  }
  if ($uid!="") {
  $fields .= ",uid";
  $values.=",$uid";
  }
  if ($type!="") {
  $fields .= ",type";
  $values.=",'$type'";
  }
  if ($route_id=="") {
  //取得父分类的 route_id
  if ($uid!=0) {
  $result = mysqlquery("select * from type where id=$uid");
  $route_id=mysql_result($result,0,"route_id");
  } else {
  $routr_id='0';
  }
  $fields .= ",route_id";
  //形成自己的 route_id
  $route_id="$route_id:$id";
  $values.=",'$route_id'";
  }
  //形成自己的 route_char
  if ($route_char!="") {
  $fields .= ",route_char";
  $route_char="$route_char:$type";
  $values.=",'$route_char'";
  } else {
  $fields .= ",route_char";
  $route_char=$type;
  $values.=",'$route_char'";
  }
  $fields = substr($fields,1,strlen($fields)-1);
  $values = substr($values,1,strlen($values)-1);
  $result = mysqlquery("insert into type ($fields) values ($values)");
  ...
  endif; /* end save */
  //分类上传************************************************
  if ($func=='createtype'):
  //取得自己的 id
  $result = mysqlquery("select * from type order by
  id desc");
  $num=mysql_numrows($result);
  if (!empty($num)) {
  $cat = mysql_result($result,0,"id");
  } else {
  $cat=0;
  }
  //判断分类的状态
  if ($uid != 0) {
  $result=mysql_query("select * from type where id=$uid");
  $type=mysql_result($result,0,"type");
  $route_char=mysql_result($result,0,"route_char");
  } else {
  $type='父分类';
  }
  echo "<FORM ACTION="$PHP_SELF?func=save" METHOD=POST>";
  echo "<table>";
  echo "<tr><td>所属类别:$type</td></tr>";
  echo "<tr><td>创建分类:<input type=text name='type' SIZE=10 MAXLENGTH=100></td></tr>";
  echo "<tr><td>";
  $cat=$cat 1;
  echo "<input type=hidden name=id value='$cat'>";
  echo "<input type=hidden name=uid value='$uid'>";
  echo "<input type=hidden name=route_char value='$route_char'>";
  echo "<INPUT TYPE=submit NAME='Save' VALUE='保存'></td></tr>";
  echo "</table>";
  echo "</form>";
  endif; /* end createtype */
  //显示分类************************************************
  if ($func=='showtype'):
  echo "<table>";
  //判断分类的状态
  if ($uid!=0) {
  $result=mysql_query("select * from type where id=$uid");
  $type=mysql_result($result,0,"type");
  } else {
  $type='父分类';
  }
  echo "<tr><td><a href='$php_self?func=createtype&uid=$uid'>创建分类</a></td></tr>";
  echo "<tr><td>$type</td></tr>";
  $result=mysql_query("select * from type where uid=$uid");
  $num=mysql_numrows($result);
  if (!empty($num)) {
  for ($i=0;$i<$num;$i ) {
  $id=mysql_result($result,$i,"id");
  $type=mysql_result($result,$i,"type");
  echo "<tr><td>";
  echo "<a href='$php_self?func=showtype&uid=$id'>$type</a>";
  echo "</td></tr>";
  }
  }
  echo "</table>";
  endif; /* end showtype */
  .....
  .....
  ?>
  以上的程序便完成了无限分类的基本创建,存储和显示,接着就是完善分类创建功能的各个部分了。

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读