如何使用PHP从两个表生成动态内容
已解决强> 谢谢,伙计们。这是我在这里的第一个问题。如果我的格式不正确,请告诉我。这是我完成的代码: 回答:如何使用PHP从两个表生成动态内容,php,mysql,sql,pdo,mariadb,Php,Mysql,Sql,Pdo,Mariadb,已解决 谢谢,伙计们。这是我在这里的第一个问题。如果我的格式不正确,请告诉我。这是我完成的代码: 回答: $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) { ?> &
$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 } ?>
这是本书中用来生成专辑的部分:
“alt=”卡片图像帽“style=”宽度:100%;">
影射
- 我有点疯了
- 标题
- 我不能和你住在一起
- 不要这么努力
- 乘风破浪
所有上帝的子民
- 这是我们生命中最美好的时光
Delilah
杀手
- Bijou
- 演出必须继续
目前,我的页面被相同的唱片集信息一次又一次地填充,因为foreach正在两个表中的每一行中迭代。如何根据唯一的唱片集生成特定的曲目?您调用
$conn->query($sql)
将再次返回整个结果集的每个循环。此外,请像下面一样使用while循环,而不是foreach循环,因为$conn->query()
返回mysqli\u 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
}
尝试在上使用,而不是使用:
$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。下面是一个链接,用于设置PDO并将其用于更安全的sql查询:
添加到循环轨迹中
首先,需要获取变量并将其分解为数组(放置在循环中):
现在,您应该可以对这些曲目执行任何操作。您可以轻松地将它们放在表格或div中。解决此问题的两种方法:
你必须稍微改变一下你的设计。 首先获取第一行,获取唱片集数据和第一首曲目 之后,绘制轨迹的其余部分并关闭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>
$sql='选择a.album\u id、a.album\u name、a.year\u released、a.record\u标签
,a.唱片封面,t.姓名,t.唱片id
从相册作为左连接曲目作为t使用(相册_id)';
$result=$conn->query($sql)//从mysql服务器获取结果
$row=$result->fetch_assoc();
?>
“alt=”卡片图像上限“style=”宽度:100%;”>
这只生成了一张专辑,下面列出了所有歌曲,无论它们来自哪个专辑。这看起来很有希望。如何调用曲目以填充每个独特专辑的曲目列表?您需要分解曲目列表以创建数组。然后在数组中循环。我会在上面的答案中加上这个。我做到了!我把它标记为已解决,并在帖子顶部提供了我的解决方案。谢谢你的帮助!不确定我是否理解如何编写SQL。我从歌曲切换到专辑,但结果看起来是一样的。“你的循环内容”是我大脑中难以理解的部分。如何列出每个唱片集的每个曲目,并且只列出正确的唱片集?然后您需要更新您的查询,我相信来自@luv2code的查询就是您要查找的内容,它将每个唱片集的歌曲分组在一个字段中,按列进行分类。我如何将其称为html并将歌曲拆分?
$tracks = explode(',',$row['track_name']);
foreach($tracks as $track_name){
echo $track_name;
}
$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>