解决!多谢你们。这是我在这里的第一个问题。让我知道我是否格式化不正确或其他原因。这是我完成的代码:
答:
$sql = 'SELECT a.*, GROUP_CONCAT(t.name) as track_name FROM albums AS a LEFT JOIN tracks AS t ON a.album_id = t.album_id GROUP BY a.album_id';
foreach ($conn->query($sql) as $row) { ?>
<div class="container">
<div class="row">
<div class="col-6">
<img src="../images/<?= $row['album_cover']?>" alt="Card image cap" style="width:100%;">
<!--shadow-->
<div class="shadow-lg p-3 mb-5 bg-white rounded">
<div class="card-body" style="padding-left:10px;">
<h4 class="card-title"><?= $row['album_name'] ?></h4>
<b><?= print_r($row['album_name'] . ' (' . $row['record_label'] . ') (' . $row['year_released'] . ')', true); ?><br><br></b>
<ul class="list-group list-group-flush">
<?php
$tracks = explode(",", $row['track_name']);
$numTracks = count($tracks);
$i = 0;
while ($i < $numTracks) { ?>
<li class="list-group-item">
<?php
echo $tracks[$i];
$i++;
?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
</div>
<?php } ?>
问题(已解决):我正在为一个学校项目工作。我必须使用php改造现有的唱片站点(女王)。我现在停留的部分是从数据库中获取专辑信息,并使用该信息将每个专辑以及专辑的曲目名称填充到页面中。我在一个表中将我的专辑信息称为专辑,在另一个表中将每个专辑的所有曲目称为音轨,其中album_id为外键。
我可以从数据库的专辑表中生成专辑标题,但是我不知道如何获取每个专辑的曲目。
这是我的SQL查询:
$sql = '
SELECT a.album_id
, a.album_name
, a.year_released
, a.record_label
, a.album_cover
, t.name
, t.album_id
FROM albums AS a
LEFT
JOIN tracks AS t
USING (album_id)
';
这是应该生成专辑的部分:
<?php
foreach ($conn->query($sql) as $row) { ?>
<div class="col-6">
<img src="../images/<?= $row['album_cover']?>" alt="Card image cap" style="width:100%;">
<!--shadow-->
<div class="shadow-lg p-3 mb-5 bg-white rounded">
<div class="card-body" style="padding-left:10px;">
<h4 class="card-title"><?= $row['album_name'] ?></h4>
<b><?= print_r($row['album_name'] . ' (' . $row['record_label'] . ') (' . $row['year_released'] . ')', true); ?><br><br></b>
<ul class="list-group list-group-flush">
<li class="list-group-item">Innuendo</li> <!-- these are just placeholders for the tracks because I don't know what to do here! -->
<li class="list-group-item">I'm Going Slightly Mad </li>
<li class="list-group-item">Headlong</li>
<li class="list-group-item">I Can't Live With You</li>
<li class="list-group-item">Don't Try So Hard </li>
<li class="list-group-item">Ride The Wild Wind</li>
<li class="list-group-item">All God's People</li>
<li class="list-group-item">These Are The Days Of Our Lives</li>
<li class="list-group-item">Delilah</li>
<li class="list-group-item">The Hitman</li>
<li class="list-group-item">Bijou</li>
<li class="list-group-item">The Show Must Go On </li>
</ul>
</div>
</div>
</div>
<?php
}
?>
就目前而言,我的页面一遍又一遍地被相同的相册信息填充,因为foreach遍历两个表中的每一行。如何根据独特的专辑生成特定的曲目?
尝试使用ON代替USING:
$sql = 'SELECT * FROM albums AS a LEFT JOIN tracks AS t ON a.album_id = t.album_id';
这应该正确连接两个表。如果每个专辑有多个曲目,则需要分别查询它们,或者使用GROUP_CONCAT将曲目加入一个组。这是完成此操作的查询:
$sql = 'SELECT a.*, GROUP_CONCAT(t.name) as track_name FROM albums AS a LEFT JOIN tracks AS t ON a.album_id = t.album_id GROUP BY a.album_id';
仅作为旁注,我强烈建议对所有与SQL有关的事物都使用PDO。这是一个设置并将其用于更安全的SQL查询的链接:https://www.w3resource.com/php/pdo/php-pdo.php
您在每个循环中调用$conn->query($sql)
,这将再次返回整个结果集。另外,使用如下所示的while循环,而不是foreach循环,因为$conn->query()
返回一个mysqli_reuslt
对象,而不是数组。
$sql = 'SELECT a.album_id, a.album_name, a.year_released, a.record_label, a.album_cover, t.name, t.album_id
FROM albums AS a LEFT JOIN tracks AS t USING (album_id)';
$result = $conn->query($sql) // return a mysqli_result object
while($row = $result->fetch_assoc()) {
// Your loop content
}
如果您坚持使用foreach循环:
$result = $conn->query($sql) // return a mysqli_result object
$rows=$result->fetch_all(MYSQLI_ASSOC); //return an array
foreach($rows as $row) {
//content
}
解决此问题的两种方法:
具有2个循环-第一次循环通过简单查询到唱片集表(无联接),然后在该循环内对数据库执行第二次查询以获取所有曲目。 (不利之处是您将对数据库进行更多查询)
或者,更改查询,以便从音轨表中进行选择,然后该联接就在专辑表中。为了使专辑标题仅对每个专辑打印一次,您需要按专辑对曲目进行排序,然后使用if语句检查循环何时开始处理其他专辑。
您必须稍微更改设计。首先您获得第一行,获得专辑数据和第一首曲目
之后,抓取轨道的其余部分并关闭html标签
$sql = 'SELECT a.album_id, a.album_name, a.year_released, a.record_label
,a.album_cover, t.name, t.album_id
FROM albums AS a LEFT JOIN tracks AS t USING (album_id)';
$result = $conn->query($sql) // get a result from the mysql server
$row = $result->fetch_assoc();
?>
<div class="col-6">
<img src="../images/<?= $row['album_cover']?>" alt="Card image cap" style="width:100%;">
<!--shadow-->
<div class="shadow-lg p-3 mb-5 bg-white rounded">
<div class="card-body" style="padding-left:10px;">
<h4 class="card-title"><?= $row['album_name'] ?></h4>
<b><?= print_r($row['album_name'] . ' (' . $row['record_label'] .
') (' . $row['year_released'] . ')', true); ?><br><br></b>
<ul class="list-group list-group-flush">
<li class="list-group-item"><?= $row['name']?></li>
<?php
//get the rest of teh tracks
while($row = $result->fetch_assoc()) {?>
<li class="list-group-item"><?= $row['name']?></li>
<?php
} //end if While
?>
</ul>
</div>
</div>
</div>