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'