当前位置:Gxlcms > PHP教程 > 打造PHP的无限分级类(完整代码及注释)_PHP教程

打造PHP的无限分级类(完整代码及注释)_PHP教程

时间:2021-07-01 10:21:17 帮助过:17人阅读

下面提供一个PHP的无限分级类代码,想要实现无限分级类的朋友们可以试试。Bug已经检查修正过,直接就能使用尖括号需要替换一下)。

1、数据库ProductShow中有b_mtype表,建表语句如下:

  1. CREATE TABLE `b_mtype` (
  2. `typeid` int(4) NOT NULL default '0',
  3. `typename` varchar(50) NOT NULL default '',
  4. `parentid` int(4) NOT NULL default '0',
  5. `parentstr` varchar(200) NOT NULL default '',
  6. `depth` int(4) NOT NULL default '0',
  7. `rootid` int(4) NOT NULL default '0',
  8. `child` varchar(200) NOT NULL default '',
  9. `orders` varchar(200) NOT NULL default '',
  10. PRIMARY KEY (`typeid`)
  11. ) TYPE=MyISAM;

2、ProductClass.php代码:直接复制即可)

  1. < html>
  2. < head>
  3. < meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  4. < title>WHB_PHP无限级分类< /title>
  5. < style type="text/css">
  6. < !--
  7. .STYLE1 {color: #FF0000}
  8. body,td,th {
  9. font-family: 宋体;
  10. font-size: 12px;
  11. }
  12. .STYLE2 {
  13. color: #FFFFFF;
  14. font-size: 14px;
  15. font-weight: bold;
  16. }
  17. -->
  18. < /style>
  19. < /head>
  20. < body>
  21. < ?php
  22. ini_set("error_reporting","E_ALL & ~E_NOTICE");//忽略所有警告信息
  23. require_once("conn.php");//嵌入连接文件
  24. @$ToDo=$_GET["ToDo"];
  25. switch($ToDo)
  26. {
  27. case "add":
  28. echo add();
  29. break;
  30. case "edit":
  31. echo edit();
  32. break;
  33. case "saveadd":
  34. echo saveadd();
  35. break;
  36. case "saveedit":
  37. echo saveedit();
  38. break;
  39. case "del":
  40. echo del();
  41. break;
  42. default:
  43. ?>
  44. < table width="90%" border="0" align="center" cellpadding="0" cellspacing="0" class="tblborder">
  45. < tr>
  46. < td valign="top">< table width="100%" border="0" cellspacing="1" cellpadding="3">
  47. < tr>
  48. < td width="55%" height="20" align="center" bgcolor="#698FC7">< span class="tblhead">< b>< span class="STYLE2">商品类别设置< /span> < a href="?ToDo=add">添加一个新类别< /a>< /b>< /span>< /td>
  49. < /tr>
  50. < /table>
  51. < table width="100%" bgcolor="#cccccc" cellspacing="1" cellpadding="3">
  52. < tr bgcolor="#F9F9F9">
  53. < td width="6%" height="21">ID< /td>
  54. < td width="49%">类别名称< /td>
  55. < td width="14%">排序< /td>
  56. < td width="31%">操作< /td>
  57. < /tr>
  58. < ?php
  59. $query=mysql_query("select * from b_mtype order by rootid,orders");
  60. while($arr=mysql_fetch_array($query))
  61. {
  62. ?>
  63. < tr>
  64. < td bgcolor="#FFFFFF">< ?php echo $arr["typeid"];?>< /td>
  65. < td bgcolor="#FFFFFF">< ?php if ($arr["depth"]>0) {
  66. for($i=1;$i< =$arr["depth"];$i++){ echo " ";}
  67. }?>
  68. < ? if($arr["child"]>0) { echo "+";}else {echo "-";}?>
  69. < ? if($arr["parentid"]==0) { echo "< b>";}?>
  70. < ? echo $arr["typename"];?>
  71. < ? if ($arr["child"]>0) {?>(< ? echo $arr["child"];?>)< ? }?>< /td>
  72. < td bgcolor="#FFFFFF">< ?php echo $arr["orders"];?>< /td>
  73. < td bgcolor="#FFFFFF">< a href="?ToDo=add&editid=< ?php echo $arr["typeid"];?>">< U>添加子类< /U>< /a>
  74. | < a href="?ToDo=edit&editid=< ?php echo $arr["typeid"]?>">< U>编辑类别< /U>< /a>
  75. | < ? if($arr["child"]==0){?>< a href="?ToDo=del&editid=< ? echo $arr["typeid"];?>" onClick="{if(confirm('删除类别时,该类别下的所有产品将一并被删除,确定删除吗?')){return true;}return false;}">< U>删除类别< /U>< /a>< ?}else{?>< a href="#" onClick="{if(confirm('该类别含有下属类别,必须先删除其下属类别方能删除本类别!')){return true;}return false;}">< U>删除类别< /U>< /a>< ?}?> < /td>
  76. < /tr>
  77. < ?php
  78. }
  79. ?>
  80. < /table>
  81. < /td>
  82. < /tr>
  83. < /table>
  84. < ?php
  85. break;
  86. }
  87. ?>
  88. < ?php ///增加类别
  89. function add(){
  90. @$editid=$_REQUEST["editid"];
  91. ?>
  92. < form name="form1" method="post" action="?ToDo=saveadd">
  93. < table width="90%" align="center" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
  94. < tr bgcolor="#CCCCCC">
  95. < td colspan="2" align="center" bgcolor="#698FC7">< span class="STYLE2">创建新的类别< /span>< /td>
  96. < /tr>
  97. < tr>
  98. < td width="25%" bgcolor="#FFFFFF">类别名称:< /td>
  99. < td width="75%" bgcolor="#FFFFFF">< input name="typename" type="text" id="typename">< /td>
  100. < /tr>
  101. < tr>
  102. < td width="25%" height=30 bgcolor="#FFFFFF">< U>所属类别< /U>< /td>
  103. < td width="75%" bgcolor="#FFFFFF">
  104. < select name=btype>
  105. < option value="0">做为主类别< /option>
  106. < ?
  107. $query=mysql_query("select * from b_mtype order by rootid,orders");
  108. while($arr=mysql_fetch_array($query)){ ?>
  109. < option value="< ? echo $arr["typeid"]?>" < ?php if($editid == $arr['typeid']){ echo " selected"; }?>>
  110. < ? if($arr["depth"]>0) {
  111. for($i=1;$i< =$arr["depth"];$i++)
  112. {
  113. echo "-";
  114. }
  115. }?>
  116. < ? echo $arr["typename"]?>< /option>
  117. < ?
  118. }
  119. ?>
  120. < /select>
  121. < /td>
  122. < /tr>
  123. < tr>
  124. < td bgcolor="#FFFFFF"> < /td>
  125. < td bgcolor="#FFFFFF">< input type="submit" name="Submit" value="保存">
  126. < label>
  127. < input type="button" name="cancel" id="cancel" value="返回" onclick="history.go(-1);" />
  128. < /label>< /td>
  129. < /tr>
  130. < /table>
  131. < /form>
  132. < ? }?>
  133. < ?php /////保存增加的类别
  134. function saveadd(){
  135. $query=mysql_query("select typeid from b_mtype order by typeid desc limit 1");
  136. while($arr=mysql_fetch_array($query)){
  137. if (!$arr["typeid"]){
  138. $postnum=1;
  139. }else{
  140. $postnum=$arr["typeid"]+1;
  141. }
  142. }
  143. if(!$postnum) $postnum=1;
  144. $ntid =$postnum;
  145. $tn =$_REQUEST["typename"];
  146. $btype =$_REQUEST["btype"];
  147. //echo $btype;
  148. if ($ntid=="" or $tn=="")
  149. {
  150. echo "< script language='javascript'>";
  151. echo "alert('参数有误,请重新填写.!');";
  152. echo "location.href='?';";
  153. echo "< /script>";
  154. die();
  155. }
  156. if ($btype!=0){
  157. $result=mysql_query("select rootid,typeid,depth,orders,parentstr from b_mtype where typeid='$btype'");
  158. $aa=mysql_fetch_array($result);
  159. $rootid=$aa['rootid'];
  160. //echo "aaaaaaaaaaa";
  161. $parentid=$aa['typeid'];
  162. $depth=$aa['depth'];
  163. $orders=$aa['orders'];
  164. $parentstr=$aa['parentstr'];
  165. //echo $rootid;
  166. if(($aa["depth"]+1)>20){ die("本分类限制最多只能有20级分类"); }
  167. }
  168. if($ntid == $btype)
  169. {
  170. echo "< script language='javascript'>";
  171. echo "alert('您所指定的typeid值重复!');";
  172. echo "location.href='?';";
  173. echo "< /script>";
  174. die();
  175. }
  176. if($btype!=0){
  177. $depth=$depth+1;
  178. $rootid=$rootid;
  179. $orders =$ntid;
  180. $parentid =$btype;
  181. //$child = $child;
  182. if ($parentstr=="0"){
  183. $parentstr=$btype;
  184. }else{
  185. $parentstr=$parentstr.",".$btype;
  186. }
  187. }else{
  188. $depth=0;
  189. $rootid=$ntid;
  190. $orders=1;
  191. $parentid=0;
  192. $child=0;
  193. $parentstr=0;
  194. }
  195. //插入类别
  196. $query=mysql_query("insert into b_mtype values('$ntid','$tn','$parentid','$parentstr','$depth','$rootid','','$orders')") ;
  197. //用于调试 echo "insert into b_mtype values('$ntid','$tn','$parentid','$parentstr','$depth','$rootid','','$orders')";
  198. if ($btype!=0)
  199. {
  200. if ($depth>0)
  201. {
  202. //当上级分类深度大于0的时候要更新其父类或父类的父类)的版面数和相关排序
  203. for ($i=1;$i< =$depth;$i++){
  204. //更新其父类版面数
  205. if ($parentid!=""){
  206. $query=mysql_query("update b_mtype set child=child+1 where typeid='$parentid'");
  207. }
  208. //得到其父类的父类的版面ID
  209. $result=mysql_query("select parentid from b_mtype where typeid='$parentid'");
  210. $par=mysql_fetch_array($result);
  211. if ($par['parentid']!=""){
  212. $parentid=$par['parentid'];
  213. }
  214. //当循环次数大于1并且运行到最后一次循环的时候直接进行更新
  215. if ($i==$depth && $parentid!=""){
  216. $query=mysql_query("update b_mtype set child=child+1 where typeid='$parentid'");
  217. }
  218. }//for循环结束
  219. //更新该版面排序以及大于本需要和同在本分类下的版面排序序号
  220. $query=mysql_query("update b_mtype set orders=orders+1 where rootid='$rootid' and orders>'$orders'");
  221. //$orders1=$orders+1;
  222. //echo "orders1=".$orders1;
  223. $query=mysql_query("update b_mtype set orders='$orders'+1 where typeid='$ntid'");
  224. }else{ //对应if ($depth>0),当上级分类深度为0的时候只要更新上级分类版面数和该版面排序序号即可
  225. $query=mysql_query("update b_mtype set child=child+1 where typeid='$btype'");
  226. $result=mysql_query("select max(orders) from b_mtype where typeid='$ntid'");
  227. $ord=mysql_fetch_array($result);
  228. $query=mysql_query("update b_mtype set orders='$ord[0]'+1 where typeid='$ntid'");
  229. }
  230. }
  231. echo "< script language='javascript'>";
  232. echo "alert('类别添加成功!');";
  233. echo "location.href='?';";
  234. echo "< /script>";
  235. }
  236. ?>
  237. < ?PHP ////修改设置
  238. function edit(){
  239. //global $db,$editid,$tn,$arr;
  240. $editid=$_REQUEST["editid"];
  241. $result=mysql_query("select * from b_mtype where typeid='$editid'");
  242. $tn=mysql_fetch_array($result);
  243. ?>
  244. < form name="form2" action ="?ToDo=saveedit" method="post">
  245. < input type="hidden" name="editid" value="< ?php echo $editid;?>">
  246. < table width="90%" border="0" align=center cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
  247. < tr>
  248. < th height=24 colspan=2 bgcolor="#698FC7" class="STYLE2">编辑类别:< ?PHP echo $tn["typename"];?>< /th>
  249. < /tr>
  250. < tr>
  251. < td width="44%" height=30 bgcolor="#FFFFFF">类别名称< /td>
  252. < td width="56%" bgcolor="#FFFFFF">
  253. < input type="text" name="typename" size="35" value="< ?php echo $tn["typename"];?>">
  254. < /td>
  255. < /tr>
  256. < tr>
  257. < td width="44%" height=30 bgcolor="#FFFFFF">< p>所属类别< /p>
  258. < p> < span class="STYLE1">特别提示:< /span>< br />
  259. 所属类别不能指定当前类别(即自己)为父类别< BR>
  260. 所属类别不能指定当前类别的子类别为父类别< /p>< /td>
  261. < td width="56%" bgcolor="#FFFFFF">
  262. < select name="class">
  263. < option value="0">做为主类别< /option>
  264. < ?
  265. $query=mysql_query("select * from b_mtype order by rootid,orders");
  266. while($arr=mysql_fetch_array($query))
  267. { ?>
  268. < option value="< ?php echo $arr[typeid]?>" < ?php if ($tn["parentid"] == $arr["typeid"]) { echo "selected"; } ?>>< ? if ($arr["depth"]>0) {?>
  269. < ?for ($i=1;$i< =$arr["depth"];$i++){ echo "-";}?>
  270. < ? } ?>< ?php echo $arr["typename"]?>< /option>
  271. < ?
  272. }
  273. ?>
  274. < /select>
  275. < /td>
  276. < /tr>
  277. < tr>
  278. < td width="44%" height=2

人气教程排行