一句SQL语句搞定无限级分类树列表
2009年11月4日
| 标签:
以前总结的方法,这次教学中给同学们提到了,就实现了出来。
- /*
- * 无限极
- * 特色:单sql语句,配合php算法,即可用一句sql查询语句列出无限极目录树
- * 数据结构
- CREATE TABLE `cat` (
- `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
- `cname` VARCHAR(50) NOT NULL,
- `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数',
- `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid',
- PRIMARY KEY (`cid`)
- )
- */
- error_reporting(7);
- mysql_connect("localhost", "root", "");
- mysql_select_db("test");
- mysql_query("set names utf-8");
- $act = $_GET['act'];
- if($act == "insert") {
- $cname = trim($_POST['cname']);
- $pid = intval($_POST['cid']);
- $query = "select * from cat where cid='$pid'";
- $res = mysql_query($query);
- $row = mysql_fetch_assoc($res);
- $parent_lev = $row['lev'];
- $query = "insert into cat set cname='$cname',lev='".($parent_lev+1)."',pid='$pid'";
- mysql_query($query);
- echo("<a href='".$_SERVER['PHP_SELF']."'>增加新分类成功");
- die;
- }else{
- $sql = "SELECT * FROM cat ORDER BY pid ASC, cid ASC";//order by pid 是后面分析的基础(勿改动)
- $res = mysql_query($sql);
- $arr = array();
- $lastPid = "";
- while($row = mysql_fetch_assoc($res)) {
- if($lastPid == "" || $row['pid'] == $lastPid) {
- ;
- }else{
- unset($lastPid);
- }
- $lastPid = $row['pid'];
- $arr[$lastPid][] = $row;
- }
- $okArr = array();
- foreach($arr[0] as $pid=>$row) {
- okArr($row); //迭代数组的每个值进行层级分析,并保存到okArr数组中
- }
- ?>
- <form method="post" action="<?php echo($_SERVER['PHP_SELF']);?>?act=insert">
- 增加分类:<select name="cid">
- <option value="">--------</option>
- < ?php
- foreach($okArr as $key=>$row) {
- ?>
- <option value="<?php echo($row['cid']);?>">
- < ?php for($i=1;$i<$row['lev'];$i++) {echo(" ");}?>
- < ?php echo($row['cname']);?></option>
- < ?php
- }
- ?>
- </select><br />
- 分类名称:<input type="text" name="cname"/><br />
- <input type="submit" value="增加"/>
- </form>
- < ?php
- }
- //迭代调用的数组分析方法
- function okArr($a) {
- global $arr, $index, $okArr;
- if(!empty($a['cname'])) {
- //当前数组a是一个单一的数组信息记录
- if(!empty($okArr[$a['pid'].'>'.$a['cid']])) {
- //已有该数组的ok信息了,通过okArr数组的键值判断
- //okArr的键值设计原则:pid>cid
- return;
- }
- //保存数组信息到okArr数组中
- $okArr[$a['pid'].'>'.$a['cid']] = $a;
- if(!empty($arr[$a['cid']])) {
- //如果该层分类下还有子分类,则迭代
- okArr($arr[$a['cid']]);
- }
- }else{
- //当前数组a是一个pid相同的多个同级分类数组
- foreach($a as $pid=>$row) {
- //迭代每个同级分类的元素
- okArr($row);
- }
- }
- }
- </a>

看不懂。。
跟俺讲的不一样啊。。。
这是单SQL语句实现的,上课时候实现的是迭代方法。不是一个方法。
这个单SQL语句的方法相对来说比较难理解。