我试图通过使用递归从数据库中获取值来创建多级动态PHP菜单。但是,由于没有,页面速度越来越慢。数据库中的记录增加。目前,DB中只有大约15条记录。
以下是代码:
<div id="nav">
<?php
$menu_html='';
function render_menu($parent_id){
$con=mysqli_connect("localhost","root","","test");
global $menu_html;
$result=mysqli_query($con, "select * from menu where parent_id=$parent_id");
if(mysqli_num_rows($result)==0) return;
if($parent_id==0)
$menu_html .= "<ul>";
else
$menu_html .= "<ul>";
while($row=mysqli_fetch_array($result)){
$menu_html .= "<li><a href=\"{$row['link']}\">{$row['label']}</a>";
render_menu($row['id']);
$menu_html .= "</li>";
}
$menu_html .= "</ul>";
return $menu_html;
}
echo render_menu(0);
?>
</ul>
</div>
这就是我的数据库的样子:
请帮忙告诉我如何优化网页速度。
由于
答案 0 :(得分:4)
您正在进行多个可以避免的数据库查询。
一次性获取所有内容并循环遍历行以构建菜单。您将拥有使用父ID构建嵌套数组所需的一切。
如果之后仍然很慢,你可以查看缓存数据库结果,甚至是整个渲染菜单。
最好在文件或内存中缓存它,并在编辑菜单项或向数据库中添加新项时专门删除缓存项,以便可以更新缓存。那么你不必过多担心你的缓存时间,你可以无限期地缓存它。
答案 1 :(得分:2)
我建议您学习嵌套集树:Managing Hierarchical Data in MySQL,它只启用1个选择/查询来构建菜单,而不需要递归函数调用。
答案 2 :(得分:0)
试试这个:
<div id="nav">
<?php
$menu_html='';
function render_menu()
{
global $menu_html;
$con=mysqli_connect("localhost","root","","test");
$result=mysqli_query($con, "SELECT * FROM menu ORDER BY parent_id ASC;");
$menu = array();
while($row=mysqli_fetch_array($result))
{
if($row['parent_id'] == 0)
{
$menu[$row['id']] = array
(
'label' => $row['label'],
'link' => $row['link'],
'children' => array()
);
}
else
{
$menu[$row['parent_id']]['children'][] = array
(
'label' => $row['label'],
'link' => $row['link']
);
}
}
$menu_html = '<ul>';
foreach($menu as $menu_item)
{
$menu_html .= '<li>';
$menu_html .= '<a href="'.$menu_item['link'].'">'.$menu_item['label'].'</a>';
if((bool)$menu_item['children'])
{
$menu_html .= '<ul>';
foreach($menu_item['children'] as $child)
{
$menu_html .= '<li>';
$menu_html .= '<a href="'.$child['link'].'">'.$child['label'].'</a>';
$menu_html .= '</li>';
}
$menu_html .= '</ul>';
}
$menu_html .= '</li>';
}
$menu_html .= '</ul>';
return $menu_html;
}
echo render_menu();
?>
</div>
答案 3 :(得分:0)
感谢大家的指导,并向我展示了正确的前进道路。 我按照这个链接完成了它。
http://wizardinternetsolutions.com/articles/web-programming/dynamic-multilevel-css-menu-php-mysql
由于