2015-08-31 27 views
0

我有一個音樂共享腳本,我試圖從我的mysql數據庫創建JSON,我試圖創建特定的結構並且似乎無法找出它如何從MySql在PHP中將曲目排列到PHP中播放列表

繼承人我的代碼

<?php 
    //Create Database connection 
    $db = mysql_connect("localhost","UN","PW"); 
    if (!$db) { 
     die('Could not connect to db: ' . mysql_error()); 
    } 

    //Select the Database 
    mysql_select_db("DB",$db); 




    $result = mysql_query("SELECT * FROM users ORDER BY username ASC"); 
    $json_response = array(); //Create an array 
    while ($row = mysql_fetch_array($result)) 
    { 
     $row_array = array(); 
     $row_array['idu'] = $row['idu']; 
     $row_array['username'] = $row['username']; 
     $row_array['first_name'] = $row['first_name']; 
     $row_array['last_name'] = $row['last_name']; 
     $row_array['country'] = $row['country']; 
     $row_array['image'] = $row['image']; 
     $row_array['cover'] = $row['cover']; 
     $row_array['description'] = $row['description']; 
     $row_array['playlists'] = array(); 
     $row_array['tracks'] = array(); 
     $plid = $row['idu']; 

     $option_qry = mysql_query("SELECT * FROM playlists where playlists.by=$plid"); 
     while ($opt_fet = mysql_fetch_array($option_qry)) 
     { 
      $row_array['playlists'][] = array(
       'id' => $opt_fet['id'], 
       'name' => $opt_fet['name'], 
       'by' => $opt_fet['by'], 
      ); 


     } 
     array_push($json_response, $row_array); //push the values in the array 


     //tracks 


     $option_qry = mysql_query("SELECT * FROM tracks where tracks.uid=$plid"); 
     while ($opt_fet = mysql_fetch_array($option_qry)) 
     { 
      $row_array['tracks'][] = array(
       'id' => $opt_fet['id'], 
       'title' => $opt_fet['title'], 
       'name' => $opt_fet['name'], 
       'art' => $opt_fet['art'], 
       'likes' => $opt_fet['likes'], 
       'downloads' => $opt_fet['downloads'], 
       'plays' => $opt_fet['views'], 
       'uid' => $opt_fet['uid'], 



      ); 


     } 
     array_push($json_response, $row_array); //push the values in the array 

    } 
    echo json_encode($json_response,JSON_PRETTY_PRINT); 

?> 

用戶表:

id username last_name first_name country etc... 
1 username1 Mynce  George  USA  etc... 
2 username2 Jenkins Fred  USA  etc... 
3 username3 Walberg Mark  USA  etc... 
4 username4 Smith  Will  USA  etc... 

播放表:

id by name 
1 4 My playlists 
2 3 Popular Songs 

playlistentries表:

id playlists track 
12 1   13 
13 1   23 
14 1   3 
15 1   17 
16 1   9 
12 2   14 
13 2   24 
14 2   4 
15 2   18 
16 2   10 

曲目表:

id title  name  art  likes downloads views 
1 song_title song1.mp3 art1.png 13  8   55 
2 song_title song2.mp3 art2.png 12  10   31 
3 song_title song3.mp3 art3.png 7  32   50 
4 song_title song4.mp3 art4.png 22  11   1 
5 song_title song5.mp3 art5.png 1  28   2 

下JSON是我試圖讓結構,我想每個播放列表,用戶創建嵌套軌道與用戶>播放列表>播放列表(用戶>播放列表1> t1,t2,t3等等)下的嵌套數組中的該播放列表相關聯... &用戶>播放列表2> t1,t2,t3等...), T for Track fyi)

我輸入了兩個播放列表在這裏「我們給你好評」和「我們給你好評2」爲例

的問題是:如何使用PLAYLISTENTRIES到陣列/窩在播放列表的軌道?我已經嵌套PLAYLISTS以下的用戶,但我不知道如何與軌道去更深一層的PLAYLISTS本身

{ 
     "idu": "2", 
     "username": "chicagochurch", 
     "first_name": "Chicago Christian Center", 
     "last_name": "", 
     "country": "United States", 
     "image": "839674815_146358938_1746691162.png", 
     "cover": "173157219_1187606488_302826016.jpg", 
     "description": "This is the official Chicago Church Music page.", 
     "playlists": [ 
      { 
       "id": "4", 
       "name": "We Give You Praise", 
       "by": "2", 
       "tracks": [ 
        { 
         "id": "29", 
         "title": "01 We Give You Praise", 
         "name": "1667450919_35711384_1898671201.mp3", 
         "art": "97020012_1272964020_1490042512.png", 
         "likes": "1", 
         "downloads": "1", 
         "plays": "4", 
         "uid": "2" 
        }, 
        { 
         "id": "30", 
         "title": "02 Luvudees", 
         "name": "1361859314_884859216_209326964.mp3", 
         "art": "1591964284_1156840179_1721104535.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "3", 
         "uid": "2" 
        }, 
        { 
         "id": "31", 
         "title": "03 Mugo Del", 
         "name": "1366849477_130736941_1367659635.mp3", 
         "art": "1181156184_556035815_1698596436.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "32", 
         "title": "04 San Amensa", 
         "name": "40925819_971317614_1732715256.mp3", 
         "art": "837149755_251638008_1945445596.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "1", 
         "uid": "2" 
        }, 
        { 
         "id": "33", 
         "title": "05 One True God", 
         "name": "1201163785_1107025307_1077346045.mp3", 
         "art": "713651840_1636034922_1247445482.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "34", 
         "title": "06 Mugo Anav", 
         "name": "173569477_686122962_117960391.mp3", 
         "art": "1432749408_578109445_1094716795.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "35", 
         "title": "07 Hallelujah", 
         "name": "133051077_70993845_552471086.mp3", 
         "art": "2040610215_1811023913_383444282.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "36", 
         "title": "08 Sheppard", 
         "name": "984429058_1532916377_1375134853.mp3", 
         "art": "1153269141_143559426_997684622.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "37", 
         "title": "09 I Love you Lord", 
         "name": "794115968_1411878888_673035094.mp3", 
         "art": "1692460167_1433248811_682631716.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "38", 
         "title": "10 Jesus In The Center", 
         "name": "202390322_461558278_1271927584.mp3", 
         "art": "1048499380_362527600_4599069.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "39", 
         "title": "11 Mugo Luvudeemos", 
         "name": "274506373_302381815_356651583.mp3", 
         "art": "1229728795_739090349_686501748.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "40", 
         "title": "12 Onday Chedo Kud", 
         "name": "378498031_1470949688_1199351944.mp3", 
         "art": "308978665_1074723934_419931699.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "41", 
         "title": "13 The Word", 
         "name": "956461611_287666310_43661088.mp3", 
         "art": "1584112229_240532531_977129308.png", 
         "likes": "1", 
         "downloads": "4", 
         "plays": "0", 
         "uid": "2" 
        } 
       ] 
      }, 
{ 
       "id": "5", 
       "name": "We Give You Praise 2", 
       "by": "2", 
       "tracks": [ 
        { 
         "id": "29", 
         "title": "01 We Give You Praise 2", 
         "name": "1667450919_35711384_1898671201.mp3", 
         "art": "97020012_1272964020_1490042512.png", 
         "likes": "1", 
         "downloads": "1", 
         "plays": "4", 
         "uid": "2" 
        }, 
        { 
         "id": "30", 
         "title": "02 Luvudees 2", 
         "name": "1361859314_884859216_209326964.mp3", 
         "art": "1591964284_1156840179_1721104535.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "3", 
         "uid": "2" 
        }, 
        { 
         "id": "31", 
         "title": "03 Mugo Del 2", 
         "name": "1366849477_130736941_1367659635.mp3", 
         "art": "1181156184_556035815_1698596436.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "32", 
         "title": "04 San Amensa 2", 
         "name": "40925819_971317614_1732715256.mp3", 
         "art": "837149755_251638008_1945445596.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "1", 
         "uid": "2" 
        }, 
        { 
         "id": "33", 
         "title": "05 One True God", 
         "name": "1201163785_1107025307_1077346045.mp3", 
         "art": "713651840_1636034922_1247445482.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "34", 
         "title": "06 Mugo Anav 2", 
         "name": "173569477_686122962_117960391.mp3", 
         "art": "1432749408_578109445_1094716795.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "35", 
         "title": "07 Hallelujah 2", 
         "name": "133051077_70993845_552471086.mp3", 
         "art": "2040610215_1811023913_383444282.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "36", 
         "title": "08 Sheppard 2", 
         "name": "984429058_1532916377_1375134853.mp3", 
         "art": "1153269141_143559426_997684622.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "37", 
         "title": "09 I Love you Lord 2", 
         "name": "794115968_1411878888_673035094.mp3", 
         "art": "1692460167_1433248811_682631716.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "38", 
         "title": "10 Jesus In The Center 2", 
         "name": "202390322_461558278_1271927584.mp3", 
         "art": "1048499380_362527600_4599069.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "39", 
         "title": "11 Mugo Luvudeemos 2", 
         "name": "274506373_302381815_356651583.mp3", 
         "art": "1229728795_739090349_686501748.png", 
         "likes": "0", 
         "downloads": "1", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "40", 
         "title": "12 Onday Chedo Kud 2", 
         "name": "378498031_1470949688_1199351944.mp3", 
         "art": "308978665_1074723934_419931699.png", 
         "likes": "0", 
         "downloads": "0", 
         "plays": "0", 
         "uid": "2" 
        }, 
        { 
         "id": "41", 
         "title": "13 The Word 2", 
         "name": "956461611_287666310_43661088.mp3", 
         "art": "1584112229_240532531_977129308.png", 
         "likes": "1", 
         "downloads": "4", 
         "plays": "0", 
         "uid": "2" 
        } 
       ] 
      } 
     ] 
    } 

,你可以在上面看到的結構,播放列表裏面名單在它自己的嵌套數組中,與它相關的軌道,我相信playlistentries表將需要用於此,但我不知道如何實現它,對所有的代碼抱歉...但感謝您的幫助!

是有可能做到這一點用表「playlistsentries」

播放列表1(並列出名稱和播放列表的信息)已經跟蹤1,2,3,4,5等。並列出每個曲目的信息?並使我試圖實現的數據結構?

因爲playlistentries似乎是表,這將使播放列表和軌道之間的連接...

我完全做什麼輸了...感謝您的幫助

+0

只是建立一個PHP結構,讓您滿意。 json編碼是所有這些中的** LAST **和** EASIEST **。 –

+0

@MarcB我從codecanyon和它的一個非常複雜的結構購買了這個腳本,並且改變它,我將不得不改變將很大的麻煩,以改變已經使用當前結構的很多事情,這就是爲什麼我試圖要知道這一點 –

回答

2

這一切開始wirh您的查詢。幾乎每當你看到自己在運行這樣的嵌套查詢時,你都應該重新思考你的方法。我建議使用連接在單個查詢中查詢所有數據,然後將結果讀入數據結構,以便輕鬆序列化爲JSON。

下面是該查詢,我會用:

SELECT 
    u.`idu` AS `user_id`, 
    u.`username` AS `user_name`, 
    u.`first_name` AS `first_name`, 
    u.`last_name` AS `last_name`, 
    u.`country` AS `user_country`, 
    u.`image` AS `user_image`, 
    u.`cover` AS `user_cover`, 
    u.`description` AS `user_description`, 
    pl.`id` AS `playlist_id`, 
    pl.`name` AS `playlist_name`, 
    t.`id` AS `track_id`, 
    t.`title` AS `track_title`, 
    t.`name` AS `track_name`, 
    t.`art` AS `track_art`, 
    t.`likes` AS `track_likes`, 
    t.`downloads` AS `track_downloads`, 
    t.`views` AS `track_plays` 
FROM users AS u 
INNER JOIN playlists AS pl 
    ON i.idu = pl.by 
INNER JOIN playlistsentries AS ple 
    ON pl.id = ple.playlists 
INNER JOIN tracks AS t 
    ON ple.track = t.id 
ORDER BY `user_id` ASC, `playlist_id` ASC, `track_id` ASC 

請注意,我別名域刪除不確定性,所以我們現在清楚我們是否有用戶,播放列表,或跟蹤級領域的工作。

提取結果集時,您一次只能遍歷一個軌道。我們已經對結果集進行了排序,以便所有用戶,播放列表和曲目都排序(分組)在一起,以便您可以查找當前行值的更改以確定是否需要爲用戶和播放列表構建新的更高級別的數據容器。

示例代碼來實現數據結構的寫你想要的和編碼,以JSON如下所示:

// variable in which to store your results to be serialize 
$result_array = array(); 
// some index and temp variables we will use to build the data structure 
$current_user_id = 0; 
$user_idx = -1; 
$current_playlist_id = 0; 
$playlist_idx = -1; 
// Your database fetch logic here. 
// I have not shown where actual query would be made. 
// The query would obviously need to succeed before getting to this code. 
// Note that you REALLY should be considering mysqli or PDO here 
// instead of deprecated mysql extension. 
while($row = /* your DB line fetch here - Consider using mysqli or PDO */) { 
    // is this a new user? 
    $user_id = (integer)$row['user_id']; 
    if($user_id !== $current_user_id) { 
     // manage our indexes 
     $current_user_id = $user_id; 
     $user_idx++; 
     $playlist_idx = -1; 
     // start a new object to store data for this user 
     $user_obj = new stdClass(); 
     // set properties on user from current row 
     // name these properties whatever you want for final JSON structure 
     $user_obj->idu = $current_user_id; 
     $user_obj->username = $row['user_name']; 
     $user_obj->first_name = $row['first_name']; 
     $user_obj->last_name = $row['last_name']; 
     $user_obj->country = $row['user_country']; 
     $user_obj->image = $row['user_image']; 
     $user_obj->cover = $row['user_cover']; 
     $user_obj->description = $row['user_description']; 
     $user_obj->playlists = array(); 
     // set object in overall result array 
     $result_array[$user_idx] = $user_obj; 
    } 

    // does this playlist already exist for this user? 
    $playlist_id = (int)$row['playlist_id']; 
    if($playlist_idx === -1 || $playlist_id !== $current_playlist_id) { 
     // manage our indexes 
     $current_playlist_id = $playlist_id; 
     $playlist_idx++; 
     // start a new object to store data for this user 
     $playlist_obj = new stdClass(); 
     // set properties on playlist from current row 
     // name these properties whatever you want for final JSON structure 
     $playlist_obj->id = $current_playlist_id; 
     $playlist_obj->name = $row['playlist_name']; 
     $playlist_obj->by = $current_user_id; 
     $playlist_obj->tracks = array(); 
     // set object in overall result array 
     $result_array[$user_idx]->playlists[$playlist_idx] = $playlist_obj; 
     } 

     // create track object 
     // we do this for every row 
     $track_obj = new stdClass(); 
     $track_obj->id = $row['track_id']; 
     $track_obj->title = $row['track_title']; 
     $track_obj->name = $row['track_name']; 
     $track_obj->art = $row['track_art']; 
     $track_obj->likes = $row['track_likes']; 
     $track_obj->downloads = $row['track_downloads']; 
     $track_obj->plays = $row['track_plays']; 
     $track_obj->uid = $current_user_id; 

     // set track object in result set 
     $result_array[$user_idx]->playlists[$playlist_idx]->tracks[] = $track_obj; 
} 
// serialize to JSON 
$result_json = json_encode($result_array); 

注:我不太清楚的區別,如果有不同的用戶ID間您爲每個嵌套級別顯示的值。如果例如曲目和/或播放列表的用戶標識代表與當前用戶不同的用戶,則上面的代碼可能需要修改。如果是這種情況,則需要將這些字段添加到查詢中,並將這些屬性添加到對象中。

+0

感謝您的意見......它超出了我的技能水平,讓我儘快掌握這一切...但今後晚些時候我會試着去掌握它......從我能理解的事情來看,它確實似乎正確的方式來接近這個 –

+0

是的,用戶ID是爲每個用戶,他們得到自己的ID(注意到用戶表), –

相關問題