如何使用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中。

解决此问题的两种方法:

  • 有两个循环-第一个循环通过一个简单的查询到albums表(无连接),然后在该循环中对数据库执行第二个查询以获得所有曲目。(缺点是您将对数据库进行更多查询)

  • 或者,更改查询,以便从“曲目”表中进行选择,然后联接在“相册”表中。若要更改查询,以便每个相册只打印一次相册标题,您需要按相册对曲目进行排序,然后使用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>
    
    $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>