SELECT 查询效率太低的问题! 用嵌套列出所有类别的话,才20几个类,就要用20几个query,效率确定不行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 function getCategoryArray() { $m = $s = 0; $sqlCategory = "SELECT * FROM `".TABLE_CATEGORY."` ORDER BY `cat_order` DESC,`cat_id` ASC"; $query = $this->db->query($sqlCategory); while ( $row = $this->db->fetch_array( $query ) ) { if($_GET['CH']==$row[cat_id]) { $this->getCategoryInfo = $row; } if($this->setCategoryListParentID==$row['parent_id'] && $row['cat_hide']=='N') { $this->getCategoryMenuList[$m]['catId'] = $row[cat_id]; if($row['show_kind']=='text') $this->getCategoryMenuList[$m]['column'] = $row['cat_name']; elseif($row['show_kind']=='logo') $this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">'; elseif($row['show_kind']=='text_logo') $this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name']; else $this->getCategoryMenuList[$m]['column'] = ''; $m++; } if($_GET['CH']==$row['parent_id'] && $row['parent_id']!=0 && $row['cat_hide']=='N' ) { $this->getCategoryNextMenuList[$s]['catId'] = $row[cat_id]; if($row['show_kind']=='text') $this->getCategoryNextMenuList[$s]['column'] = $row['cat_name']; elseif($row['show_kind']=='logo') $this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">'; elseif($row['show_kind']=='text_logo') $this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name']; else $this->getCategoryNextMenuList[$s]['column'] = ''; $s++; } // $this->categoryArray[$row[parent_id]][$row[cat_id]] = array( 'cat_id' => $row[cat_id], 'parent_id' => $row[parent_id], 'cat_name' => $row[cat_name], 'cat_type' => $row[cat_type], 'cat_url' => $row[cat_url], 'cat_validate' => $row[cat_validate], 'cat_order' => $row[cat_order], ); $this->catFatherArray[$row[cat_id]][$row[parent_id]] = array( 'cat_id' => $row[cat_id], 'parent_id' => $row[parent_id], 'cat_name' => $row[cat_name], 'cat_type' => $row[cat_type], 'cat_url' => $row[cat_url], 'cat_validate' => $row[cat_validate], 'cat_order' => $row[cat_order], ); } $this->db->free_result( $query ); } <?phprequire "main.php"; $db1=NewADOConnection(SH_DB_TYPE); $db1->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库"); $query1="select * from cate"; $result1=$db1->Execute($query1) or die("数据库错误,请联系管理员");?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>无标题文档</title></head><body><form name="form1" method="post" action=""> <p> </p> <p> <select name="select2"> <? while(!$result1->EOF){ $categoryid=$result1->fields[0];echo "<p><option>"."-*".$result1->fields[1]."*-"."</option></p>"; $db2=NewADOConnection(SH_DB_TYPE); $db2->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库"); $query2="select * from class where class_cateid=$categoryid"; $result2=$db2->Execute($query2) or die("数据库错误,请联系管理员"); while($row2=$result2->FetchNextObject()) { echo "<option value=$row2->SOCLASS_ID>".$row2->SOCLASS_NAME."</option></p>"; }$result1->MoveNext();} ?> </select></p> <p> </p> <p> </p> <p> </p></form></body></html> 上面我就是列出TABLE_CATEGORY中所有的数据后,在类中再进行嵌套循环在整个系统中只读取一次数据库 呵呵,给你们一个最简单的算法好了,<?php$data = array(array('id'=>1, name=>'name1', 'pid'=>0), array('id'=>2, name=>'name1', 'pid'=>1), array('id'=>3, name=>'name1', 'pid'=>0), array('id'=>4, name=>'name1', 'pid'=>3), array('id'=>5, name=>'name1', 'pid'=>0), array('id'=>6, name=>'name1', 'pid'=>2), array('id'=>7, name=>'name1', 'pid'=>6), array('id'=>8, name=>'name1', 'pid'=>4), array('id'=>9, name=>'name1', 'pid'=>7) );$level = $result = array();foreach($data as $value){ $level[$value['pid']][$value['id']] = 'END';}$result = $level[0];doLevel($level, $result);function doLevel(&$level,&$result){ foreach($result as $key=>$value){ if(isset($level[$key])){ $result[$key] = $level[$key]; doLevel(&$level, &$result[$key]); } }}echo "<pre>"; print_R($result);?>整个代码分为几个部分:第一步从数据库中选出所有的分类上面的例子中($data是我从数据库中选出来的分类的结果集),第二步通过循环制作一个数据等级二维数组。第三步通过递归函数生成一个用分类的id值作为键值的多位数组,这个数组就是最后的等技数组。第四步打印出来结果集。结果有两个部分可以用$data存储分类信息。$result存储等级信息。------------------------------------------------------------如果你是从数据库选。可以把$data的负值语句删了,把foreach($data as $value)改成foreach($value = $this->db->fetch_array($query))就可以了具体的事例如下:<?php$sqlCategory = "SELECT * FROM catogory";$query = $this->db->query($sqlCategory);$level = $result = array();foreach($value = $this->db->fetch_array($query)){ $level[$value['pid']][$value['id']] = 'END';}$result = $level[0];doLevel($level, $result);function doLevel(&$level,&$result){ foreach($result as $key=>$value){ if(isset($level[$key])){ $result[$key] = $level[$key]; doLevel(&$level, &$result[$key]); } }}echo "<pre>"; print_R($result);?> 我的方法很简单,一个level字段填入一个分类的所有父ID(包括自己),然后如此Select即可:Select * from 'class' where parid = 0 order by level很方便,能树型列出来,不过排序是个问题.暂时还没时间解决 不可能啊,我这里可打印出来啊,这个是我刚才看了这个帖子才意兴大发,花了半个小时考虑出来的啊,不要打击我,呵呵。--------------------------------------------------------肯定可以运行的,代码不会有问题的。等级树的样式如下******注意看,数组的建值****Array( [1] => Array ( [2] => Array ( [6] => Array ( [7] => Array ( [9] => END ) ) ) ) [3] => Array ( [4] => Array ( [8] => END ) ) [5] => END)------------------------------------------------------可以不用递归,可以参考xml_parse_into_struct生成的结果集的样式处理。生成两个数组,样式如下$aaaa['id'] = 'pid'$bbbb['pid'] = 'id'然后再处理成多维数组 不错不错,.你在数组里添加一个order,再按照order排序看看,嘿嘿 http://www.phpx.com/happy/thr62348.html速度N快. 有用thinkphp的吗?smarty配置问题 php 打印等宽度字符? 求段正则。。。 高分求一个PHP转换视频文件成FLV(swf)的类(150分),请高手指点 关于模板生成表格会重复输出列的问题,请教高手 php格式的网页上传问题 请教高手! 请问在phpgtk中怎么调用win api函数?? 如何获取网页里面的表格? jiathis生成代码复制粘贴到项目上不显示图标 各位对定时产生静态html有何妙法? ◆◆◆菜鸟问:如何用PHP来操作MySQL数据库◆◆◆---在线等
{
$m = $s = 0;
$sqlCategory = "SELECT * FROM `".TABLE_CATEGORY."` ORDER BY `cat_order` DESC,`cat_id` ASC";
$query = $this->db->query($sqlCategory);
while ( $row = $this->db->fetch_array( $query ) )
{
if($_GET['CH']==$row[cat_id])
{
$this->getCategoryInfo = $row;
}
if($this->setCategoryListParentID==$row['parent_id'] && $row['cat_hide']=='N')
{
$this->getCategoryMenuList[$m]['catId'] = $row[cat_id];
if($row['show_kind']=='text')
$this->getCategoryMenuList[$m]['column'] = $row['cat_name'];
elseif($row['show_kind']=='logo')
$this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">';
elseif($row['show_kind']=='text_logo')
$this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name'];
else
$this->getCategoryMenuList[$m]['column'] = '';
$m++;
}
if($_GET['CH']==$row['parent_id'] && $row['parent_id']!=0 && $row['cat_hide']=='N' )
{
$this->getCategoryNextMenuList[$s]['catId'] = $row[cat_id];
if($row['show_kind']=='text')
$this->getCategoryNextMenuList[$s]['column'] = $row['cat_name'];
elseif($row['show_kind']=='logo')
$this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">';
elseif($row['show_kind']=='text_logo')
$this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name'];
else
$this->getCategoryNextMenuList[$s]['column'] = '';
$s++;
}
//
$this->categoryArray[$row[parent_id]][$row[cat_id]]
= array(
'cat_id' => $row[cat_id],
'parent_id' => $row[parent_id],
'cat_name' => $row[cat_name],
'cat_type' => $row[cat_type],
'cat_url' => $row[cat_url],
'cat_validate' => $row[cat_validate],
'cat_order' => $row[cat_order],
);
$this->catFatherArray[$row[cat_id]][$row[parent_id]]
= array(
'cat_id' => $row[cat_id],
'parent_id' => $row[parent_id],
'cat_name' => $row[cat_name],
'cat_type' => $row[cat_type],
'cat_url' => $row[cat_url],
'cat_validate' => $row[cat_validate],
'cat_order' => $row[cat_order],
);
}
$this->db->free_result( $query );
}
require "main.php";
$db1=NewADOConnection(SH_DB_TYPE);
$db1->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库");
$query1="select * from cate";
$result1=$db1->Execute($query1) or die("数据库错误,请联系管理员");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body><form name="form1" method="post" action="">
<p> </p>
<p> <select name="select2">
<? while(!$result1->EOF)
{ $categoryid=$result1->fields[0];
echo "<p><option>"."-*".$result1->fields[1]."*-"."</option></p>";
$db2=NewADOConnection(SH_DB_TYPE);
$db2->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库");
$query2="select * from class where class_cateid=$categoryid";
$result2=$db2->Execute($query2) or die("数据库错误,请联系管理员");
while($row2=$result2->FetchNextObject())
{
echo "<option value=$row2->SOCLASS_ID>".$row2->SOCLASS_NAME."</option></p>";
}
$result1->MoveNext();
}
?>
</select>
</p>
<p> </p>
<p> </p>
<p> </p>
</form>
</body>
</html>
<?php$data = array(array('id'=>1, name=>'name1', 'pid'=>0),
array('id'=>2, name=>'name1', 'pid'=>1),
array('id'=>3, name=>'name1', 'pid'=>0),
array('id'=>4, name=>'name1', 'pid'=>3),
array('id'=>5, name=>'name1', 'pid'=>0),
array('id'=>6, name=>'name1', 'pid'=>2),
array('id'=>7, name=>'name1', 'pid'=>6),
array('id'=>8, name=>'name1', 'pid'=>4),
array('id'=>9, name=>'name1', 'pid'=>7)
);
$level = $result = array();
foreach($data as $value){
$level[$value['pid']][$value['id']] = 'END';
}
$result = $level[0];
doLevel($level, $result);function doLevel(&$level,&$result){
foreach($result as $key=>$value){
if(isset($level[$key])){
$result[$key] = $level[$key];
doLevel(&$level, &$result[$key]);
}
}
}
echo "<pre>"; print_R($result);?>
整个代码分为几个部分:
第一步从数据库中选出所有的分类
上面的例子中($data是我从数据库中选出来的分类的结果集),第二步通过循环制作一个数据等级二维数组。第三步通过递归函数生成一个用分类的id值作为键值的多位数组,这个数组就是最后的等技数组。第四步打印出来结果集。结果有两个部分可以用
$data存储分类信息。
$result存储等级信息。------------------------------------------------------------
如果你是从数据库选。可以把$data的负值语句删了,
把foreach($data as $value)改成
foreach($value = $this->db->fetch_array($query))就可以了
具体的事例如下:<?php$sqlCategory = "SELECT * FROM catogory";
$query = $this->db->query($sqlCategory);
$level = $result = array();
foreach($value = $this->db->fetch_array($query)){
$level[$value['pid']][$value['id']] = 'END';
}
$result = $level[0];
doLevel($level, $result);function doLevel(&$level,&$result){
foreach($result as $key=>$value){
if(isset($level[$key])){
$result[$key] = $level[$key];
doLevel(&$level, &$result[$key]);
}
}
}
echo "<pre>"; print_R($result);?>
Select * from 'class' where parid = 0 order by level
很方便,能树型列出来,不过排序是个问题.暂时还没时间解决
--------------------------------------------------------
肯定可以运行的,代码不会有问题的。等级树的样式如下
******注意看,数组的建值****
Array
(
[1] => Array
(
[2] => Array
(
[6] => Array
(
[7] => Array
(
[9] => END
) ) ) ) [3] => Array
(
[4] => Array
(
[8] => END
) ) [5] => END
)------------------------------------------------------
可以不用递归,可以参考xml_parse_into_struct生成的结果集的样式处理。
生成两个数组,样式如下
$aaaa['id'] = 'pid'
$bbbb['pid'] = 'id'
然后再处理成多维数组