Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在两个while循环中完成这个复杂的查询_Php_Mysql - Fatal编程技术网

Php 如何在两个while循环中完成这个复杂的查询

Php 如何在两个while循环中完成这个复杂的查询,php,mysql,Php,Mysql,我正在创建一个音乐播放器,可以将歌曲添加到播放列表中。但是,如果歌曲已经添加到播放列表中,我想隐藏该特定歌曲的播放列表。我这么说是因为你可以有多个播放列表,一首歌可以在多个播放列表中 代码 <?php $shuffle = $_GET["shuffle"]; $songsContent = $db->query("SELECT * FROM songs WHERE song_band='$band' &

我正在创建一个音乐播放器,可以将歌曲添加到播放列表中。但是,如果歌曲已经添加到播放列表中,我想隐藏该特定歌曲的播放列表。我这么说是因为你可以有多个播放列表,一首歌可以在多个播放列表中

代码

<?php
      
      $shuffle = $_GET["shuffle"];
    
        $songsContent = $db->query("SELECT * FROM songs WHERE song_band='$band' && album_name='$album'");
         
      $numSongsContent = $songsContent->num_rows;
      
      $number = 0;
      
      while($fetch_songs = mysqli_fetch_array($songsContent)) {
        $number++;
        $song_path = $fetch_songs["song_path"];
        $song_title = $fetch_songs["song_title"];
        $song_band = $fetch_songs["song_band"];
        echo "<div class='songs' path='Music/$song_band/$song_path.mp3' number='$number' total='$numSongsContent'> $song_title <div id='song_playlist'> <i class='fa fa-plus' aria-hidden='true'></i>
 Add to Playlist <div id='song_playlist_popup'>";
 
 
 $getPlaylists = $db->query("SELECT * FROM playlists");
 
 
 while($fetch_playlists = mysqli_fetch_array($getPlaylists)) {
    $playlist_name = $fetch_playlists["playlist_name"];

使用
$getPlaylists
选择所有现有播放列表,并在第二个
中循环检查重复的入口。
为什么不在
$getPlaylists
中混合使用
$getPlaylists
$checkDuplicates

正如其他人在评论中所说,您可以通过将查询修改为以下内容来加入表:

SELECT * 
FROM playlists pl
LEFT JOIN playlist_songs pls ON pl.playlist_name = pls.playlist_name
WHERE song_name != song_name='$song_title'
通过此查询,您应该可以获得所有在
Playlist\u songs
中没有包含
$song\u title
项的播放列表,这样您就不需要再使用
$checkDuplicates
检查重复项了



最后一点建议。我真的建议您在数据库中使用ID作为外键,因为名称并不总是唯一的。

关于您的代码有很多注释

  • 尽量减少对数据库的请求。不要试图在一个查询中请求所有数据,但绝对不要对表中的每一行单独请求

  • 如果某些数据没有更改,请请求一次。例如,不需要为每首歌曲请求播放列表列表。只要请求一次就足够了

  • 使用ID作为外键。了解数据库索引和外键
  • 您的任务可以通过执行以下操作来解决:
    • 制作如下表格:歌曲(歌曲id、名称、任何其他数据…);播放列表(播放列表id、名称、任何其他数据…);播放列表歌曲(id、播放列表id、歌曲id)
    • 每个表提出一个请求
    • 迭代表playlist\u歌曲并创建多维数组
      $songsPlaylists=array(song\u id=>array(playlist\u id,playlist\u id,…)
    • 输出歌曲,对于在播放列表上迭代的每首歌曲,如果不是
      在\u数组中(playlist\u id,$songsPlaylists[song\u id])
      ,则输出播放列表
  • 不要忘记学习安全性(SQL注入、OWASP前10名等)

  • 祝你学习好运

    通过消除while循环,使其更简单、更高效。query->loop-through results->基于先前结果的查询99.9%的时间可以被join替换。@e4c5我可以试试,这是我第一年的编程。我还在学习…有一些关于SQL连接的优秀教程。看起来您需要一个三表联接。如果感觉有两种威胁,首先尝试合并播放列表和播放列表_songs@e4c5你介意提供一个例子吗?你能提供你的表结构和更多的代码格式吗?
     <?php
          
          $shuffle = $_GET["shuffle"];
        
            $songsContent = $db->query("SELECT * FROM songs WHERE song_band='$band' && album_name='$album'");
             
          $numSongsContent = $songsContent->num_rows;
          
          $number = 0;
          
          while($fetch_songs = mysqli_fetch_array($songsContent)) {
            $number++;
            $song_path = $fetch_songs["song_path"];
            $song_title = $fetch_songs["song_title"];
            $song_band = $fetch_songs["song_band"];
            echo "<div class='songs' path='Music/$song_band/$song_path.mp3' number='$number' total='$numSongsContent'> $song_title <div id='song_playlist'> <i class='fa fa-plus' aria-hidden='true'></i>
     Add to Playlist <div id='song_playlist_popup'>";
     
     
    $getPlaylists = $db->query("SELECT *
    FROM playlists pl
    LEFT JOIN playlist_songs pls ON pl.playlist_name = pls.playlist_name
    WHERE song_name != song_name='$song_title'");
     
     
     while($fetch_playlists = mysqli_fetch_array($getPlaylists)) {
        $playlist_name = $fetch_playlists["playlist_name"];
        
          echo "<div id='playlist_name'> <span song='$song_title'> $playlist_name </span> </div>";
        
     }
     
     echo  "<div id='playlist_name2'> <span id='playlist_input_errors'></span> <input id='playlist_input' placeholder='Create new Playlist' song='$song_title'> </div> </div> </div> </div>";
    
          }
          
          ?>
    
    SELECT * 
    FROM playlists pl
    LEFT JOIN playlist_songs pls ON pl.playlist_name = pls.playlist_name
    WHERE song_name != song_name='$song_title'