如何使用PHP从两个表中生成动态内容

问题描述 投票:0回答:4

解决!多谢你们。这是我在这里的第一个问题。让我知道我是否格式化不正确或其他原因。这是我完成的代码:

答:

$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遍历两个表中的每一行。如何根据独特的专辑生成特定的曲目?

php mysql sql pdo mariadb
4个回答
0
投票

尝试使用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


0
投票

您在每个循环中调用$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
} 

0
投票

解决此问题的两种方法:

  1. 具有2个循环-第一次循环通过简单查询到唱片集表(无联接),然后在该循​​环内对数据库执行第二次查询以获取所有曲目。 (不利之处是您将对数据库进行更多查询)

  2. 或者,更改查询,以便从音轨表中进行选择,然后该联接就在专辑表中。为了使专辑标题仅对每个专辑打印一次,您需要按专辑对曲目进行排序,然后使用if语句检查循环何时开始处理其他专辑。


0
投票

您必须稍微更改设计。首先您获得第一行,获得专辑数据和第一首曲目

之后,抓取轨道的其余部分并关闭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>
© www.soinside.com 2019 - 2024. All rights reserved.