您的位置:首页 > 数据库 > MySQL

mysql 数据库分类设计常用方法

2013-06-08 17:51 363 查看
以下内容来自:http://yut-i.blog.163.com/blog/static/24257782200862852022422/ 修改版本

// 数据库 lin3615,表 cates,以下为表结构和连接信息
/*
create table cates
(
id int(11) unsigned auto_incrment primary key,
pid int(10) unsigned,
catename varchar(100),
cateorder int(10),
createdate date
)
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (1, 0, '新闻', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (2, 0, '图片', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (3, 1, '国内新闻', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (4, 1, '国际新闻', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (5, 3, '省份新闻', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (6, 4, '欧洲新闻', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (7, 2, '人物图片', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (8, 2, '风景图片', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (9, 7, '欧洲明星', NULL, NULL);
INSERT INTO `cates` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (10, 9, '英国明星', NULL, NULL);

*/
$db_host = 'localhost';
$db_user = 'root';
$db_password = '123456';
$db_name = 'lin3615';
$link = mysql_connect($db_host, $db_user, $db_password) or die('Error:'.mysql_error());
mysql_select_db($db_name, $link);
mysql_query("set names utf8",$link);

function getList($pid=0, &$result = array())
{
global $link;
$sql = "select * from cates where pid = {$pid}";
$res = mysql_query($sql, $link);
while($row = mysql_fetch_assoc($res))
{
//$row['catename'] = $row;
$result[] = $row;
getList($row['id'],$result);
}
return $result;
}

$res = getList(0);
//print_r($res);
/*
结果形式为
array[0] = array(
id => 1,
pid => 0,
catename => 新闻
)
array[1] =array(
id = 3,
pid => 1,
catename => 国内新闻
....
)
array[2] = array(
id => 5,
pid => 3,
catename => 省份新闻
)
array[3] = array(
id => 4,
pid => 1,
catename => 国际新闻
)
array[4] = array(
id => 6,
pid => 4,
catename => 欧洲新闻
)
array[5] = array(
id => 2,
pid => 0,
catename => 图片
)
array[6] = array(
id => 7,
pid => 2,
catename => 人物图片
)
array[7] = array(
id => 9,
pid => 7,
catename => 欧洲明星
)
array[8] = array(
id => 10,
pid => 9,
catename => 英国明星
)
array[9] = array(
id => 8,
pid => 2,
catename => 风景图片
)
)
*/
// 分类全路径
function getCatePath($cid, & $arr = array())
{
global $link;
$sql = "select * from cates where id = {$cid}";
$res = mysql_query($sql, $link);
$row = mysql_fetch_assoc($res);
if($row)
{
$arr[] = $row;
getCatePath($row['pid'],$arr);
}
//krsort($arr);
return $arr;
}
$cates = getCatePath(10);
krsort($cates);
print_r($cates);
/*
结果:
array[3] = array(
id => 2,
pid => 0,
catename => 图片
)
array[2] = array(
id => 7,
pid => 2,
catename => 人物图片
)
array[1] = array(
id => 9,
pid => 7,
catename => 欧洲明星
)
array[0] = array(
id => 10,
pid => 9,
catename => 英国明星
)
*/


以下为全路径分类法;

/*
数据表:其中数据库名为 test
create table cate(
id int(11) not null auto_increment primary key,
parent_id int(4) not null default '0',
path varchar(200) not null default '1',
name varchar(200) not null
);

数据库连接信息:
*/
$link = mysql_connect('主机名','用户名','密码') or die('Can not connect');
mysql_select_db('test');
mysql_query('set names utf8', $link);

//1.增加分类:
$p = $_POST['vv']; // 为传递过来的值
$name = '我的测试';
$sql = "select max(id) as maxid from cate";
$r = mysql_query($sql);
$rr = mysql_fetch_assoc($r);
$maxid = implode(',',$rr);
$maxid += 1;
if($p != 0)
{
$sql1 = "select path from cate where id='{$p}'";
$r1 = mysql_query($sql1);
$rr1 = mysql_fetch_assoc($r1);
$path = implode(',', $rr1);
$path .= ','.$maxid;
$query = "insert into cate(`parent_id`,`path`,`name`) values ('{$p}','{$path}', '{$name}')";
mysql_query($query);
}
else
{
$query = "insert into cate(`parent_id`,`path`,`name`) values ('{$p}','{$maxid}', '{$name}')";
mysql_query($query);
}
/*
2.编辑分类

具体思路是:
  1.查找出传递过来的ID中纪录里面 path 的字段值; (保存为 $x_path_old)
  2.判断传递过来 parent_id 的值(就是传递过来要修改的 parent_id 值)
  如果 不为 0
     查找 ID 值为 传递过来的 ID纪录中 parent_id 的值,并取出其中的 path 字段值:(x_parent_path)
    设置 $x_path_new = concat($x_parent_path,',',$_id) (把传递的 id 值,即就是要编辑的 分类的ID 添加到其父级的 path 字段中去)
  如果 为 0
     设置 $x_path_new = $_id(传递过来的 id 值);
  3. 更新相关数据
代码如下:
*/
$sql = "select path from cate where id=$_POST['id']";
$res = mysql_query($sql);
$row = mysql_fetch_assoc($res);
$arr[] = $row['path'];
$x_path_old = implode(',', $arr);
if($_POST['parent_id'] != 0)
{
$query = "select path from cate where id=$_POST['parent_id']";
$res = mysql_query($query);
$row = mysql_fetch_assoc($res);
$arr[] = $row['path'];
$x_parent_path = implode(',', $arr);
$x_path_new = $x_parent_path . ',' . $_POST['id'];
}
else
{
$x_path_new = $_POST['id'];
}

$querys = update `cate` set name=$_POST['name'], parent_id=$_POST['parent_id'] where id=$_POST['id'];
$queryss = update set path = $_path_new where path = $x_path_old;
mysql_query($querys)
mysql_query($queryss);

//3.取出所有分类

$sql1 = "select * from cate order by path";
$result = mysql_query($sql1);
while($row = mysql_fetch_assoc($result))
{
$len = strlen($row['path']);
for($i = 0; $i<$len; $i++){
echo "  ";
}
echo $row['name']."<br />";
}

//4.取单个分类

$sql2 = "select * from cate where id=$_POST['id']";
$result = mysql_query($sql2);
while($row = mysql_fetch_assoc($result))
{
echo $row['name'];
}

//5.取出同一级分类

$sql3 = "select * from cate where parent_id = (select parent_id from cate where id=$_POST['id'])";
$result = mysql_query($sql3);
while($row = mysql_fetch_assoc($result))
{
print_r($row);
}

//6.得到一个分类的路径

$sql4 = "select path from cate where id=$_POST['id']";
$res = mysql_query($sql4);
$paths = mysql_fetch_assoc($res);
$arr = explode(',',$paths['path']);
$a = array();
foreach($arr as $v)
{
$sql = "select * from cate where id = ('{$v}')";

$re = mysql_query($sql);
$arrs = mysql_fetch_assoc($re);
$a[] = $arrs;
}
foreach($a as $v)
{
print_r($v);
}


以下内容来自:http://yut-i.blog.163.com/blog/static/24257782200862852022422/ 修改版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: