在我的网站上,我想创建一个类似于this的导航栏,其中包含类别(此处为2012)和文章(此处为5月至10月)。我有一个包含所有类别(infocat_id,name)的MySQL数据库和一个包含所有文章(标题,正文,类别,infopost_id)的数据库。
我以为我可以按如下方式编写我的php代码:
<ul>
<?php
$query1 = $db->prepare("SELECT infocat_id, name FROM info_category");
$query1->execute();
$query1->bind_result($infocat_id, $name);
while($query1->fetch()):
?>
<li>
<?php echo $name; ?>
<ul>
<?php
$query2 = $db->prepare("SELECT title, infopost_id FROM info_posts WHERE category = $infocat_id");
$query2->execute();
$query2->bind_result($title, $infopost_id);
while($query2->fetch()):
?>
<li><?php echo $title; ?></li>
<?php endwhile; ?>
</ul>
</li>
<?php endwhile; ?>
</ul>
可悲的是,这不会起作用,因为我只得到了第一个类别名称,并且在那个&#34;致命错误:在[目录中的非对象上调用成员函数execute()) php-file位于[行$query2->execute();
]的行上。
我认为我无法使用JOIN,因为我还需要第一个查询的输出。
我对PHP没有超级经验,所以如果有人能够帮助我,那将非常感激。
答案 0 :(得分:0)
使用join来获得所需的输出:
SELECT cat.infocat_id, cat.name,post.title, post.infopost_id
FROM info_category cat
left join
info_posts post on post.category=cat.infocat_id
注意:如果仅在匹配条件下需要数据,请使用INNER JOIN。
答案 1 :(得分:0)
您可以使用联接,只需检查密钥的更改,以决定是否再次输出标题。
粗暴地敲了敲,没有经过测试,但是这样的事情: -
<ul>
<?php
$prev_infocat_id = 0;
$query1 = $db->prepare("SELECT infocat_id, name, title, infopost_id
FROM info_category
LEFT OUTER JOIN info_posts
ON info_category.infocat_id = info_posts.category");
$query1->execute();
$query1->bind_result($infocat_id, $name, $title, $infopost_id);
while($query1->fetch())
{
if ($prev_infocat_id == 0)
{
echo '<li>';
}
else
{
if ($prev_infocat_id != $infocat_id)
{
echo '</li><li>';
}
}
$prev_infocat_id = $infocat_id;
echo '<li>'.$title.'</li>';
}
if ($prev_infocat_id != 0)
{
echo '</li>';
}
?>
</ul>