初学者在这里,请保持温柔。我有一张桌子,其中一列是书名,另一列是他们的相应作者。我正在使用PDO连接到数据库并在网页上显示查询的结果。基本上,我希望每个UNIQUE作者都显示一次,然后在下面列出该作者写的每个书名的列表,如下所示:
Author 1
title1
title2
Author 2
title3
title4
查询以获取不同作者的列表:
<?php try {
$connection = new PDO($dsn, $username, $password, $options);
$sql = "SELECT DISTINCT author FROM booktable;"
$statement = $connection->prepare($sql);
$result = $statement->fetchAll();
} ?>
Foreach循环以显示每个作者:
<?php foreach ($result as $row) { ?>
<p><?php echo ($row["author"]); ?></p>
<?php } ?>
到目前为止,这很好,这给了我一系列独特的作者。对于标题,我试图在另一个嵌套的foreach循环中显示第二个查询,但是我无法弄清楚如何仅获得当前循环的作者。我尝试像这样在循环内设置变量:
<?php foreach ($result as $row) { ?>
<p><?php echo ($row["author"]); ?></p>
<?php $currentauthor = ($row["author"]); ?>
<?php foreach ($result2 as $row2) { ?>
<p><?php echo ($row2["title"]); ?></p>
<?php } ?>
<?php } ?>
然后在我的原始TRY中添加另一个查询(以及相应的新连接和提取语句):
$sql2 = "SELECT * FROM booktable WHERE author = '$currentauthor'";)
但这不会返回任何内容,因为$ currentauthor变量在foreach循环之外不存在。所以这是我的问题。我会用这种错误的方式吗?
答案 0 :(得分:0)
看起来您应该能够使用单个非连接查询来完成您要尝试的操作。您可以使用SELECT * FROM booktable ORDER BY author
并遍历其结果,仅当检测到当前记录的作者不同于先前的记录时(显然是第一条记录),才输出作者数据。
您是新手,请注意:*
中的SELECT *
对于最终部署的查询通常被认为是错误的形式;我在这里只是将其用作占位符,因为我不知道您要从中获取数据的所有字段。最好指定要使用的所有字段,因为它是:(1)记录使用的数据而不必检查与该数据一起使用的所有代码,(2)通过不依赖于表定义来使查询不那么脆弱对于列顺序,(3)如果从表中删除了一个使用过的字段,则使查询中断,而不是后面的代码假定该值将在那里(然后必须将其追溯到查询),(4)保留需要一起收集并仅传输到所需数据的数据量,以及(5)更多...