php 二级分类问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 二级分类问题相关的知识,希望对你有一定的参考价值。

数据库结构
id parent_id name
三个字段 做什么的大家看名字就知道
添加的时候现在我把父分类的parent_id 设置为0
查询的时候我想先查出所有数据
然后再用一种方式拼成一个二维数组
输出这种效果
分类A
a b c
分类B
c d e
求拼数组的思路

你这个是在做无线栏目分类,现在方法很多,比较实用的用递归调用 ,左右直调用

简单的解决方案:
数据库结构

CREATE TABLE `class` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(250) character set gbk default NULL,
`classid` int(10) default NULL,
`sort` int(10) default '10',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 AUTO_INCREMENT=11 ;

php处理文件

<div id="main"> <a href="?action=">分类列表</a> <a href="?action=add">添加分类</a>
<?php

$mysql = new mysql_Class('localhost','root','');

$mysql -> select_db('myde520');

switch($_GET['action'])
case 'add':
$class_arr=array();
$sql = "select * from `class` order by sort asc, id Desc";
$query = $mysql -> query($sql);
while($row = $mysql -> fetch_array($query))
$class_arr[] = array($row['id'],$row['name'],$row['classid'],$row['sort']);

?>
<form action="?action=act_add" method="post">
<table border="0" cellpadding="0" cellspacing="0" class="table02">
<thead>
<tr>
<td colspan="2"><div align="center">添加分类</div></td>
</tr>
</thead>
<tr>
<td><div align="right">分类名称:</div></td>
<td><input name="name" type="text" class="input" id="name" value="" size="40" /></td>
</tr>
<tr>
<td><div align="right">所属分类ID:</div></td>
<td><select name="classid" id="classid">
<option value="0">-----顶级分类-----</option>
<?php
dafenglei_select(0,0,0);
?>
</select>
</td>
</tr>
<tr>
<td><div align="right">排序:</div></td>
<td><input name="sort" type="text" class="input" id="sort" value="10" size="25" /></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="button" id="button" value="添加分类" />
<input type="reset" name="button2" id="button2" value="重置" />
</div></td>
</tr>
</table>
</form>
<?php
break;
case 'act_add':
$sql = "INSERT INTO `class` (`name`,`classid`,`sort`) VALUES('".$_POST['name'];
$sql .= "',".$_POST['classid'].",".$_POST['sort'].")";
$mysql -> query($sql);
msg('添加成功!','?action=');
break;
case 'edit':
$class_arr=array();
$sql = "select * from `class` order by sort asc, id Desc";
$query = $mysql -> query($sql);
while($row = $mysql -> fetch_array($query))
$class_arr[] = array($row['id'],$row['name'],$row['classid'],$row['sort']);

$sql = "select * from `class` where id=".$_GET['id'];
$query = $mysql -> query($sql);
$row = $mysql -> fetch_array($query);
if($row)
?>
<form action="?action=act_edit" method="post">
<table border="0" cellpadding="0" cellspacing="0" class="table02">
<thead>
<tr>
<td colspan="2"><div align="center">修改分类</div></td>
</tr>
</thead>
<tr>
<td><div align="right">分类名称:</div></td>
<td><input name="name" type="text" class="input" id="name" value="<?php echo $row['name'];?>" size="40" /></td>
</tr>
<tr>
<td><div align="right">所属分类ID:</div></td>
<td><select name="classid" id="classid">
<option value="0">-----顶级分类-----</option>
<?php
dafenglei_select(0,0,$row['classid']);
?>
</select>
</td>
</tr>
<tr>
<td><div align="right">排序:</div></td>
<td><input name="sort" type="text" class="input" id="sort" value="<?php echo $row['sort'];?>" size="25" /></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="button" id="button" value="修改分类" />
<input type="hidden" id="id" name="id" value="<?php echo $_GET['id'];?>" />
<input type="reset" name="button2" id="button2" value="重置" />
</div></td>
</tr>
</table>
</form>
<?php
else
msg('要修改的记录不存在!','?action=');

break;
case 'act_edit':
$sql = "select id from `class` where id=".$_POST['id'];
$query = $mysql -> query($sql);
$row = $mysql -> fetch_array($query);
if($row)
if($row['id']==$_POST['classid'])
msg('修改失败,不能自己是自己的子分类!','?action=');
else
$sql = "update `class` set `name`='".$_POST['name']."',`classid`=".$_POST['classid'];
$sql .= ",`sort`=".$_POST['classid']." where `id`=".$_POST['id'];
$mysql -> query($sql);
msg('修改成功!','?action=');


break;
case 'del':
$sql = "select * from `class` where id=".$_GET['id'];
$query = $mysql -> query($sql);
$row = $mysql -> fetch_array($query);
if($row)
$mysql -> query("delete `id` from `class` where id=".$_GET['id']);
msg('删除成功!','?action=');
else
msg('记录不存在!','?action=');

break;
case '':
$class_arr=array();
$sql = "select * from `class` order by sort asc, id Desc";
$query = $mysql -> query($sql);
while($row = $mysql -> fetch_array($query))
$class_arr[] = array($row['id'],$row['name'],$row['classid'],$row['sort']);

?>
<table class="table">
<thead>
<tr>
<td >分类名称</td>
<td width="60"><div align="center">排序</div></td>
<td width="80"><div align="center">操作</div></td>
</tr>
</thead>
<?php dafenglei_arr(0,0);?>
</table>
<?php
break;


?>
</div>

<?php
function msg($msg,$url)

echo "<script type=\"text/javascript\">alert('$msg');window.location.href='$url';</script>";


function dafenglei_arr($m,$id)

global $class_arr;
global $classid;
global $mysql;
if($id=="") $id=0;
$n = str_pad('',$m,'-',STR_PAD_RIGHT);
$n = str_replace("-","  ",$n);
for($i=0;$i<count($class_arr);$i++)
if($class_arr[$i][2]==$id)
echo "<tr>\n";
echo " <td>".$n."|--<a href=\"?action=edit&id=".$class_arr[$i][0]."\">".$class_arr[$i][1]."</a></td>\n";
echo " <td><div align=\"center\">".$class_arr[$i][3]."</div></td>\n";
echo " <td><div align=\"center\"><a href=\"?action=edit&id=".$class_arr[$i][0]."\">修改</a>";
echo " <a href=\"?action=del&id=".$class_arr[$i][0]."\">删除</a>";
echo "</div></td>\n";
echo " </tr>\n";
dafenglei_arr($m+1,$class_arr[$i][0]);






function dafenglei_select($m,$id,$index)

global $class_arr;
$n = str_pad('',$m,'-',STR_PAD_RIGHT);
$n = str_replace("-","  ",$n);
for($i=0;$i<count($class_arr);$i++)

if($class_arr[$i][2]==$id)
if($class_arr[$i][0]==$index)
echo " <option value=\"".$class_arr[$i][0]."\" selected=\"selected\">".$n."|--".$class_arr[$i][1]."</option>\n";
else
echo " <option value=\"".$class_arr[$i][0]."\">".$n."|--".$class_arr[$i][1]."</option>\n";

dafenglei_select($m+1,$class_arr[$i][0],$index);







/**
*-------------------------数据库操作类-----------------------------*
*/
class mySql_Class

function __construct($host, $user, $pass)

@mysql_connect($host,$user,$pass) or die("数据库连接失败!");
mysql_query("SET NAMES 'gbk'");


function select_db($db)//连接表

return @mysql_select_db($db);


function query($sql)//执行SQL语句

return @mysql_query($sql);


function fetch_array($fetch_array)

return @mysql_fetch_array($fetch_array, MYSQL_ASSOC);


function close() //关闭数据库

return @mysql_close();


function insert($table,$arr) //添加记录

$sql = $this -> query("INSERT INTO `$table` (`".implode('`,`', array_keys($arr))."`) VALUES('".implode("','", $arr)."')");
return $sql;



?>
参考技术A $arr = array(
array('id'=>'1','parent_id'=>'0','name'=>'aa'),
array('id'=>'2','parent_id'=>'0','name'=>'bb'),
array('id'=>'3','parent_id'=>'1','name'=>'cc'),
array('id'=>'4','parent_id'=>'1','name'=>'dd'),
array('id'=>'5','parent_id'=>'2','name'=>'ee'));
foreach($arr as $k=>$v)

if($v[parent_id]==0)

$arr1[] = $v[id];


foreach($arr1 as $k=>$v)

foreach($arr as $key=>$val)

if($v == $val[parent_id])

$arr2[$v][$val[id]] = $val;





echo '<pre>';var_dump($arr2);eixt;

其上不拼数组好做一点 而且这个不能无限分类本回答被提问者和网友采纳
参考技术B 第一次查询 parent_id = 0 并且获取其 $id1 = id ,这也就是一级分类
第二次查询 parent_id = $id1 这就是二级分类
用一个循环或者递归就行,如果只需要取到二级,循环即可。如果要多级,那么需要递归。
至于拼数组,那就随便你了可以这样定义
$category_info = array ( 'name' => '父分类', 'id' => 1, 'child' => array () );
然后你设置 $category_info ['child'] 就行,获取的时候 $category_info ['child'] [n]追问

现在不能有第二次查询 只能查数据库一次

追答

一次查询就不好办了。为何只能查询一次呢?

追问

在循环里查询数据影响效率

追答

其实如果数据量不大,也还好
有时候只有这个办法。
同时你要考虑缓存,分类应该不会总是变动,适当的缓存,就不用每次都查询。

(实用篇)jQuery+PHP+MySQL实现二级联动下拉菜单

二级联动下拉菜单选择应用在在很多地方,比如说省市下拉联动,商品大小类下拉选择联动。本文将通过实例讲解使用jQuery+PHP+MySQL来实现大小分类二级下拉联动效果。

先看下效果

 

实现的效果就是当选择大类时,小类下拉框里的选项内容也随着改变。实现原理:根据大类的值,通过jQuery把值传给后台PHP处理,PHP通过查询MySQl数据库,得到相应的小类,并返回JSON数据给前端处理。

XHTML

首先我们要建立两个下拉选择框,第一个是大类,第二个是小类。大类的值可以是预先写好,也可以是从数据库读取。

<label>大类:</label> 
<select name="bigname" id="bigname"> 
   <option value="1">前端技术</option> 
   <option value="2">程序开发</option> 
   <option value="3">数据库</option> 
</select> 
<label>小类:</label> 
<select name="smallname" id="smallname"> 
</select> 

jQuery

先写一个函数,获取大类选择框的值,并通过$.getJSON方法传递给后台server.php,读取后台返回的JSON数据,并通过$.each方法遍历JSON数据,将对应的值写入一个option字符串,最后将option追加到小类里。

function getSelectVal(){ 
    $.getJSON("server.php",{bigname:$("#bigname").val()},function(json){ 
        var smallname = $("#smallname"); 
        $("option",smallname).remove(); //清空原有的选项 
        $.each(json,function(index,array){ 
            var option = "<option value=‘"+array[‘id‘]+"‘>"+array[‘title‘]+"</option>"; 
            smallname.append(option); 
        }); 
    }); 
} 

注意,在遍历JSON数据追加之前一定要先将小类里的原有的项清空。清空选项的方法有两种,一种是上文代码中提到,还有一种更简单直接的方法:

smallname.empty(); 

然后,在页面载入后执行调用函数:

$(function(){ 
    getSelectVal(); 
    $("#bigname").change(function(){ 
        getSelectVal(); 
    }); 
}); 

在页面初始的时候,下拉框是要设置选项的,所以在初始的时候就要调用getSelectVal(),而当大类选项改变时,也调用了getSelectVal()。

PHP

include_once("connect.php"); //链接数据库 
 
$bigid = $_GET["bigname"]; 
if(isset($bigid)){ 
    $q=mysql_query("select * from catalog where cid = $bigid"); 
    while($row=mysql_fetch_array($q)){ 
        $select[] = array("id"=>$row[id],"title"=>$row[title]); 
    } 
    echo json_encode($select); 
} 

根据jQuery传递过来的大类的value值,构造SQL语句查询分类表,最终输出JSON数据。本站在未做特别说明的情况下所使用的PHP与MySQL连接,和查询语句等均使用原始语句方法如mysql_query等,目的就是为了让读者能够直观的知晓数据的传输查询。

最后附上MYSQL表结构:

CREATE TABLE `catalog` ( 
  `id` mediumint(6) NOT NULL auto_increment, 
  `cid` mediumint(6) NOT NULL default ‘0‘, 
  `title` varchar(50) NOT NULL, 
  PRIMARY KEY  (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8; 

 

以上是关于php 二级分类问题的主要内容,如果未能解决你的问题,请参考以下文章

为wordpress的分类以及子分类指定固定模版

产品分类栏目调取一级地区下的二级地区

php无限分类

Mybatis练习(一对多:查询所有的一级分类,同时查询二级分类,以及查询二级分类下的所有图书)

ecshop二级分类显示该大分类下的所有品牌

MyBatis练习查询所有的一级分类,同时查询二级分类,以及查询二级分类下的所有图书