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程序设计有所帮助。