我在博客中找到了无限制的菜单功能,并尝试将查询从mysql_ *更改为PDO。当mysql_ *查询运行时,菜单将呈现所有子项。但是当我尝试用PDO执行相同的功能时,它不会渲染所有菜单。
数据库结构
id | name | link | parent_id
-----------------------------------------
1 | Home | p.php | 0
2 | Portfolio | p.php | 0
3 | Projects | p.php | 0
4 | Contact | p.php | 0
5 | Web Design| p.php | 2
6 | Grap. Desg| p.php | 2
.
.
.
14 | Quote | p.php | 6
.
-----------------------------------------
使用mysql_ * Query;
<?php
$menu_html='';
function render_menu($parent_id){
global $menu_html;
$result=mysql_query("select * from menu_options where parent_id=$parent_id");
if(mysql_num_rows($result)==0) return;
if($parent_id==0)
$menu_html.="<ul id=\"menu\">\r\n";
else
$menu_html.="\r\n<ul>";
while($row=mysql_fetch_array($result)){
$menu_html.="\r\n<li><a href=\"{$row['url']}\">{$row['name']}</a>";
render_menu($row['id']);
$menu_html.="</li>";
}
$menu_html.="\r\n</ul>";
return $menu_html;
}
echo render_menu(0);
?>
结果
-Home
-Portfolio
--Web Design
--Graphic Design
-- Quote <- CORRECT RENDER
--Logo Design
--Blog Design
-Projects
--Project1
--Projects
--Project2
--Project3
--Project4
-Contact
--Support
--General Inquiry
但是当我们尝试使用PDO时;
<?php
$menuHtml='';
function createMenu($parentId){
global $menuHtml;
global $db;
$query = $db->prepare('SELECT * FROM menu_options WHERE `parent_id` = ?');
$query->bindParam(1, $parentId, PDO::PARAM_INT);
$query->execute();
$result = $query->fetch(PDO::FETCH_OBJ);
$rowCount = $query->rowCount();
if ($rowCount == 0) return;
if ($parentId == 0)
$menuHtml.="<ul id=\"menu\">\r\n";
else
$menuHtml.='<ul>';
while($row = $query->fetch(PDO::FETCH_OBJ))
{
$menuHtml.='<li><a href="'.$row->url.'">'.$row->name.'</a>';
createMenu($row->id);
$menuHtml.='</li>';
}
$menuHtml.='</ul>';
return $menuHtml;
}
echo createMenu(0);
?>
结果;
-Portfolio
--Graphic Design
--Logo Design
--Blog Design
-Projects
--Project2
--Project3
--Project4
-Contact
--General Inquiry
某些parent_id = 0未呈现且许多菜单未呈现。 我错过了什么?我的PDO查询有什么问题? 任何帮助都会大大增加。
答案 0 :(得分:1)
您可能会在获得行数之前添加一行。这是获取第一个结果行,然后你什么都不做?
尝试删除标有---&gt;
的行<?php
$menuHtml='';
function createMenu($parentId){
global $menuHtml;
global $db;
$query = $db->prepare('SELECT * FROM menu_options WHERE `parent_id` = ?');
$query->bindParam(1, $parentId, PDO::PARAM_INT);
$query->execute();
---> $result = $query->fetch(PDO::FETCH_OBJ);
$rowCount = $query->rowCount();
if ($rowCount == 0) return;
if ($parentId == 0)
$menuHtml.="<ul id=\"menu\">\r\n";
else
$menuHtml.='<ul>';
while($row = $query->fetch(PDO::FETCH_OBJ))
{
$menuHtml.='<li><a href="'.$row->url.'">'.$row->name.'</a>';
createMenu($row->id);
$menuHtml.='</li>';
}
$menuHtml.='</ul>';
return $menuHtml;
}
echo createMenu(0);
?>
答案 1 :(得分:1)
你用这一行诋毁你父母的每个第一个孩子:
$result = $query->fetch(PDO::FETCH_OBJ);
摆脱它,它会正常工作