【问题标题】:MySQL - 2 while loops not working as expectedMySQL - 2个while循环没有按预期工作
【发布时间】:2014-05-29 01:16:27
【问题描述】:

在我的表中,我有“艺术家”和“歌曲”,现在我想输出艺术家姓名,然后是我数据库中该艺术家的所有歌曲。像我在下面的代码中那样使用一个 while 循环不起作用。

<div class="panel-group space" id="accordion"> <!-- ACCORDION FOR FOLDER/TRACK SELECTION -->

  <?php
    $con=mysqli_connect('localhost','root','raspberry','raspberryfm'); 
    $result = mysqli_query($con,"SELECT DISTINCT artist FROM playlist ORDER BY artist");

      while($row = mysqli_fetch_array($result)) {
        $artistnbsp = str_replace(' ', '_', $row['artist']);
        $artist = $row['artist'];

        $result2 = mysqli_query($con,"SELECT song FROM playlist WHERE artist= $artist");
        while($row = mysqli_fetch_array($result2)) {

        $song = $row['song'];
        echo '
          <div class="panel panel-default">
            <div class="panel-heading">
              <h4 class="panel-title align2 color2">
                <a data-toggle="collapse" data-parent="#accordion" href="#collapse'.$artistnbsp.'">
                  '.$artist.'
                  <button type="button" class="btn btn-success btn-sm pull-right pb">Play All</button>
                </a>
              </h4>
            </div>
          <div id="collapse'.$artistnbsp.'" class="panel-collapse collapse">
            <div class="panel-body color2">'
            . $song .
            '</div>
          </div>
          </div>';
        }
        }
    mysqli_close($con);
  ?>
</div>

【问题讨论】:

  • WHERE artist= $artist" 更改为WHERE artist= '$artist'",这可能是此处的一个促成因素,其中需要引用$artist。我怀疑这是一个整数。与1 相比,与Stevie Ray Vaughan 不同;-)
  • 您在两个循环中都使用了 $row ,这两个循环相互覆盖。改用 $row2。
  • 这对我有用,非常感谢!但是现在我遇到了另一个问题,这张图片可能解释得更好:i.epvpimg.com/C1jbe.png 我想要的是为每个艺术家提供一个手风琴,里面装满了所有的歌曲。现在我每首歌都有一个。
  • 不客气。您在下面尝试过 Robbert 的回答吗?
  • 是的,它确实有效,但图像上的问题仍然存在。

标签: php mysql while-loop


【解决方案1】:

您自己修复它做得很好,但是您的嵌套查询是不必要的,并且可能会导致性能问题。

通过一些数组操作,您可以有一个查询,而不是每个艺术家一个:

<?php
$con=mysqli_connect('localhost','root','raspberry','raspberryfm');
$result = mysqli_query($con,"SELECT * FROM playlist");

$artists_songs=array();
while($row = mysqli_fetch_array($result)) {

  $artists_songs[$row['artist']][]=array(
      'song'=>$row['song'],
      'artist'=>$row['artist'],
      'artistnbsp'=>str_replace(' ', '_', $row2['artist'])
  );

}

foreach ($artists_songs as $artist) :?>
<div class="panel panel-default">
    <div class="panel-heading">
        <h4 class="panel-title align2 color2">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapse<?php echo $artist[0]['artistnbsp'];?>">
                <?php echo $artist[0]['artist'];?>
                <button type="button" class="btn btn-success btn-sm pull-right pb">Play All</button>
            </a>
        </h4>
    </div>
    <div id="collapse<?php echo $artist[0]['artistnbsp'];?>" class="panel-collapse collapse">
        <div class="panel-body color2">
            <?php foreach($artist as $details):?>
                <p><?php echo $artist['song'];?></p>
            <?php endforeach;?>
        </div>
    </div>
</div>

<?php endforeach;?>

【讨论】:

  • 感谢您的提示。但是我只会在我上车时加载一次,所以我不介意性能。你能看看我的另一个问题吗? stackoverflow.com/questions/23908095/…
  • @Stantastic 当然,我会看看。即使这只是一个个人项目,好的做法也值得学习
【解决方案2】:

您正在用第二个 while 循环覆盖第一个循环中的 $row。您应该将其重命名为$row2 或其他名称

while($row = mysqli_fetch_array($result)) {

  $artistnbsp = str_replace(' ', '_', $row['artist']);
  $artist = $row['artist'];

  $result2 = mysqli_query($con,"SELECT song FROM playlist WHERE artist= $artist");
  while($row2 = mysqli_fetch_array($result2)) {

另外,$artist 是数值吗?如果不是,除非您在$artist 周围加上引号,否则上述查询将失败。您还应该考虑使用 mysqli 的参数功能,而不是将变量直接放在查询中。

【讨论】:

  • 这对我有用,非常感谢!但现在我遇到了另一个问题,这张图片可能解释得更好:i.epvpimg.com/C1jbe.png 我想要的是为每个艺术家提供一个手风琴,里面装满了所有的歌曲。现在我每首歌都有一个。
【解决方案3】:

我自己设法找到并解决了问题。谢谢你们这么快地帮助我!

            <div class="panel-group space" id="accordion"> <!-- ACCORDION FOR FOLDER/TRACK SELECTION -->

            <?php
                $con=mysqli_connect('localhost','root','raspberry','raspberryfm'); 
                $result = mysqli_query($con,"SELECT DISTINCT artist FROM playlist ORDER BY artist");

                    while($row2 = mysqli_fetch_array($result)) {

                        $artistnbsp = str_replace(' ', '_', $row2['artist']);
                        $artist = $row2['artist'];


                        echo '
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                    <h4 class="panel-title align2 color2">
                                        <a data-toggle="collapse" data-parent="#accordion" href="#collapse'.$artistnbsp.'">
                                            '.$artist.'
                                            <button type="button" class="btn btn-success btn-sm pull-right pb">Play All</button>
                                        </a>
                                    </h4>
                                </div>
                            <div id="collapse'.$artistnbsp.'" class="panel-collapse collapse">
                                <div class="panel-body color2">';

                                    $result2 = mysqli_query($con,"SELECT song FROM playlist WHERE artist= '$artist'");
                                    while($row3 = mysqli_fetch_array($result2)) {

                                        $song = $row3['song'];

                                            echo $song;
                                            echo "<br/>";

                                    }
                        echo '  
                                </div>
                            </div>
                            </div>';

                    }
                mysqli_close($con);
            ?>
        </div>

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多