php+mysql数据库实现无限分类的方法
本文实例讲述了php+mysql数据库实现无限分类的方法。分享给大家供大家参考。具体分析如下:
这款php无限分类代码比较完整理包括了数据库是mysql的,有增加、删除、编辑、移动的功能,同时还提供数据库sql表结构.代码如下:
//连接数据库 $link=mysql_connect('localhost','root','')ordie(mysql_error()); mysql_select_db('class',$link)ordie(mysql_error()); mysql_query("setnamesgbk"); //无限分类类库 classsortclass{ var$data=array(); var$child=array(-1=>array()); var$layer=array(-1=>-1); var$parent=array(); var$link; var$table; functionsortclass($link,$table){ $this->setnode(0,-1,'顶极节点'); $this->link=$link; $this->table=$table; $node=array(); $results=mysql_query("select*from$this->table",$this->link); while($node=mysql_fetch_array($results)){ $this->setnode($node['id'],$node['f_id'],$node['name']); } } functionsetnode($id,$parent,$value){ $parent=$parent?$parent:0; $this->data[$id]=$value; $this->child[$id]=array(); $this->child[$parent][]=$id; $this->parent[$id]=$parent; $this->layer[$id]=!isset($this->layer[$parent])?0:$this->layer[$parent]+1; } functiongetlist(&$tree,$root=0){ foreach($this->child[$root]as$key=>$id){ $tree[]=$id; if($this->child[$id])$this->getlist($tree,$id); } } functiongetvalue($id){return$this->data[$id];} functiongetlayer($id,$space=false){ return$space?str_repeat($space,$this->layer[$id]):$this->layer[$id]; } functiongetparent($id){return$this->parent[$id];} functiongetparents($id){ while($this->parent[$id]!=-1){ $id=$parent[$this->layer[$id]]=$this->parent[$id]; } ksort($parent); reset($parent); return$parent; } functiongetchild($id){return$this->child[$id];} functiongetchilds($id=0){ $child=array($id); $this->getlist($child,$id); return$child; } functionaddnode($name,$pid){ //echo"insertinto$this->table(`f_id`,`name`)values('$pid','$name')";exit; mysql_query("insertinto$this->table(`f_id`,`name`)values('$pid','$name')",$this->link); } functionmodnode($cid,$newname){ mysql_query("update$this->tableset`name`='$newname'where`id`=$cid",$this->link); } functiondelnode($cid){ $allchilds=$this->getchilds($cid); $sql=''; if(emptyempty($allchilds)){ $sql="deletefrom$this->tablewhere`id`=$cid"; }else{ $sql='deletefrom'.$this->table.'where`id`in('.implode(',',$allchilds).','.$cid.')'; } mysql_query($sql,$this->link); } functionmovenode($cid,$topid){ mysql_query("update$this->tableset`f_id`=$topidwhere`id`=$cid",$this->link); } } //函数 functionback(){ echo'<scriptlanguage="网页特效">window.location.href="news.class.php?"+newdate().gettime();</script>'; exit; } //生成select functionmakeselect($array,$formname){ global$tree; $select='<selectname="'.$formname.'">'; foreach($arrayas$id){ $select.='<optionvalue="'.$id.'">'.$tree->getlayer($id,'|-').$tree->getvalue($id)."</option>"; } return$select.'</select>'; } $tree=newsortclass($link,'`p_newsclass`'); $op=!emptyempty($_post['op'])?$_post['op']:$_get['op']; if(!emptyempty($op)){ if($op=='add'){ $tree->addnode($_post['cname'],$_post['pid']); back(); } if($op=='mod'){ $tree->modnode($_post['cid'],$_post['cname']); back(); } if($op=='del'){ $tree->delnode($_get['cid']); back(); } if($op=='move'){ $tree->movenode($_post['who'],$_post['to']); back(); } } $category=$tree->getchilds(); ?>
前台调用实例代码如下:
<styletype="text/css"> body{font-size:12px;} ul{list-style:none;} a{cursor:pointer;} </style> <scriptlanguage="javascript"> function$(e){returndocument.getelementbyid(e);} functionmod(cid){ $('cid').value=cid; $('op').value='mod'; $('name').style.border='1pxsolidred'; } </script> <formaction=""method="post"> 名称:<inputtype="text"id="name"name="cname"/>添加到:<?=makeselect($category,'pid')?><br/> <inputtype="hidden"id="op"name="op"value="add"/> <inputtype="hidden"id="cid"name="cid"/> <inputtype="submit"value="submit"/> </form> <h3>移动分类</h3> <formaction=""method="post"> <?=makeselect($category,'who')?>gt;移动到:<?=makeselect($category,'to')?> <inputtype="hidden"id="op"name="op"value="move"/> <inputtype="submit"value="submit"/> </form> <ul> <?php foreach($categoryas$id){ echo'<li>'.$tree->getlayer($id,'|-').$tree->getvalue($id).'<ahref="time.php?op=del&cid='.$id.'">del</a><aonclick="mod('.$id.')">edit</a></li>'; } ?> </ul>
用phpmyadmin导入此数据库就ok了,实例代码如下:
--phpmyadminsqldump --version3.2.4 -- --主机:localhost --生成日期:2010年07月02日03:02 --服务器版本:5.1.41 --php版本:5.3.1 setsql_mode="no_auto_value_on_zero"; /*!40101set@old_character_set_client=@@character_set_client*/; /*!40101set@old_character_set_results=@@character_set_results*/; /*!40101set@old_collation_connection=@@collation_connection*/; /*!40101setnamesutf8*/; -- --数据库:`class` -- ---------------------------------------------------------- -- --表的结构`p_newsclass` -- createtableifnotexists`p_newsclass`( `id`int(7)notnullauto_increment, `f_id`int(7)notnull, `name`varchar(255)notnull, primarykey(`id`) )engine=innodb defaultcharset=utf8auto_increment=10; -- --转存表中的数据`p_newsclass` -- insertinto`p_newsclass`(`id`,`f_id`,`name`)values (3,0,'中国'), (4,3,'福建'), (5,4,'龙岩市'), (7,4,'厦门市'), (9,5,'漳平市'); /*!40101setcharacter_set_client=@old_character_set_client*/; /*!40101setcharacter_set_results=@old_character_set_results*/; /*!40101setcollation_connection=@old_collation_connection*/;
希望本文所述对大家的PHP+mysql程序设计有所帮助。