我正在尝试在索引页面上显示帖子的评论数量,其中会显示帖子的标题。
我可以显示索引上创建的标题,正文,发布者和日期,但它的评论数量除外。即使我的查询设置正确,我也很难从数据库中选择它。
<?php if(empty($posts)): ?>
<p>There are currently no posts.</p>
<?php else: ?>
<?php foreach($posts as $post): ?>
<div class="post">
<div class="title"><a href="<?php echo BASE_URL; ?>/post.php?post=<?php echo $post['id']; ?>"><?php echo $post['name']; ?></a></div>
<div class="short-body"><?php echo $post['body']; ?> <a href="#">Read more</a></div>
<div class="posted-by">Posted by <?php echo $post['user']; ?></div> <div class="date">On <?php echo $post['created']; ?>
| <?php foreach ($comments as $comment): echo $comment[0]; ?> comments <?php endforeach; ?> </div>
</div>
<?php endforeach; ?>
<?php endif; ?>
除了评论数量之外,所有内容都通过上面的代码显示在页面上。
以下是其背后的评论代码和查询:
$posts = $db->query("SELECT name,body,id,created,user FROM posts ORDER by id DESC")->fetchAll(PDO::FETCH_ASSOC);
$id = $posts['id'];
$comments = $db->prepare("SELECT COUNT(*) FROM comments where $post_id=:post_id");
$comments->execute(['post_id' => $id]);
$comments = $comments->fetch(PDO::FETCH_NUM);
我确信我的问题是没有正确使用$ id。虽然我不知道该放什么。 post_id被分配给帖子的id,其中评论存储在数据库中。我已经尝试了很多东西但仍然无效。
答案 0 :(得分:2)
我认为您可以使用单个查询检索帖子信息和评论数量,这可以避免您的问题并提高效率;例如:
SELECT
posts.name,
posts.body,
posts.id,
posts.created,
posts.user,
count(comments.id) AS comments_count
FROM posts
LEFT JOIN comments ON comments.post_id = posts.id
GROUP BY posts.id DESC
根据原始查询,我认为问题是$posts
包含多行,因此$posts['id']
不存在,$posts[0]['id']
也存在,$posts[1]['id']
等等。 ..如果你想保留原始查询,你应该遍历$posts
以将评论数量与结果中的每个帖子相关联。