【问题标题】:How to generate dynamic content from two tables with PHP如何使用 PHP 从两个表中生成动态内容
【发布时间】:2020-01-30 05:18:23
【问题描述】:

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

答案:

$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 改造现有的唱片网站(Queen)。我现在坚持的部分是从数据库中提取专辑信息并使用它来填充每个专辑的页面以及专辑的曲目名称。我将专辑信息放在一个称为专辑的表中,并将每个专辑的所有曲目放在另一个称为曲目的表中,其中专辑 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


    【解决方案1】:

    您在每个循环中调用$conn-&gt;query($sql),这将再次返回整个结果集。另外,请使用下面的 while 循环,而不是 foreach 循环,因为 $conn-&gt;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
    } 
    

    【讨论】:

    • “你的循环内容”是我难以理解的部分。如何列出每张专辑的每首曲目并且只列出正确的专辑?
    • 那么你需要更新你的查询,我相信来自@luv2code的查询就是你要找的
    • 返回每张专辑歌曲组合在一个字段中,按列分隔。如何将其调用到 html 中并将歌曲拆分?
    【解决方案2】:

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

    添加到循环曲目

    首先,您需要获取变量并将其分解为一个数组(放置在循环中):

    $tracks = explode(',',$row['track_name']);
    foreach($tracks as $track_name){
       echo $track_name;
    }
    

    现在您应该可以对这些曲目做任何您想做的事情了。您可以轻松地将它们放在表格或 div 中。

    【讨论】:

    • 这看起来很有希望。如何调出曲目以填充每个唯一专辑的曲目列表?
    • 您需要分解曲目列表以创建一个数组。然后循环遍历数组。我会将其添加到上面的答案中。
    • 我做到了!我将其标记为已解决,并在帖子顶部提供了我的解决方案。感谢您的帮助!
    【解决方案3】:

    解决此问题的两种方法:

    1. 有 2 个循环 - 第一个循环通过对专辑表的简单查询(无连接),然后在该循​​环中对数据库执行第二个查询以获取所有曲目。 (缺点是您将对数据库进行更多查询)

    2. 或者,更改您的查询,以便从曲目表中进行选择,然后在专辑表上进行连接。为了让每个专辑的专辑标题只打印一次,您需要按专辑对曲目进行排序,然后有一个 if 语句来检查循环何时开始处理不同的专辑。

    【讨论】:

    • 不确定我是否理解如何编写 SQL。我将 FROM 切换为曲目,将 JOIN 切换为专辑,但结果看起来相同。
    【解决方案4】:

    你必须稍微改变你的设计。 首先你得到第一行得到专辑数据和第一首曲目

    然后你抓住轨道的其余部分并关闭 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>
    

    【讨论】:

    • 这只生成了一张专辑,其中列出了所有歌曲,无论它们来自哪个专辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多