2012-01-09 1 views
0

Я выполняю запрос, который возвращает список комментариев, как показано ниже:Как вложить результаты второго mysql в каждую строку объекта JSON?

$sQuery = " 
     select cp_comments.*,users.user_login, users.user_url, users.display_name, users.ID as avatar, cp_comments.id as replies 

     from ".$wpdb->prefix."cp_comments cp_comments 
      left join ".$wpdb->prefix."users users on users.ID=cp_comments.uid 
      where songid='$id' 
      order by cp_comments.id asc 
    "; 
    $result1 = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 

Я тогда Переберите результаты и кодировать JSON массив следующим образом:

/* 
* Output 
*/ 
$output = array(

    "comments" => array() 

); 


while ($aRow = mysql_fetch_array($result1, MYSQL_ASSOC)) 
{ 

    $row = array(); 

    for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 

     if ($aColumns[$i] == "playtime") 
     { 
      /* Special output formatting for 'playtime' column */ 
      $row[$aColumns[$i]] = ($aRow[ $aColumns[$i] ])/$duration * 100; 
     }   
     else if ($aColumns[$i] == "avatar") 
     { 
      /* Special output to render Avatar by user id */ 
      $row[$aColumns[$i]] = commentplayer_get_user_avatar($aRow[ $aColumns[$i] ]); 
     } 
     else if ($aColumns[$i] != ' ') 
     { 
      /* General output */ 
      $row[$aColumns[$i]] = $aRow[ $aColumns[$i] ]; 
     } 
    } 

    $output['comments'][] = $row; 

} 

echo json_encode($output); 

Это дает ответ JSON как показано на рисунке: -

{ "comments" : [ { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "More tests....", 
     "display_name" : "admin", 
     "id" : "26", 
     "playtime" : 36.206896551699998, 
     "posttime" : "2011-10-08 11:11:55", 
     "cid" : "26", 
     "songid" : "30", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 

     }, 
     { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "test comment", 
     "display_name" : "admin", 
     "id" : "70", 
     "playtime" : 29.597701149399999, 
     "posttime" : "2011-10-13 15:51:01", 
     "cid" : "70", 
     "songid" : "30", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     }, 
     { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "Another genius comment....", 
     "display_name" : "admin", 
     "id" : "71", 
     "playtime" : 48.8505747126, 
     "posttime" : "2011-10-13 15:55:38", 
     "cid" : "71", 
     "songid" : "30", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     } 
    ] } 

Однако мне нужно извлечь «ответы» на каждый комментарий (которые хранятся в отдельной таблице и гнездо их в го один и тот же объект JSON.

Так что окончательный кодированный в формате JSON выводится следующим образом: - Я не могу работать, как гнезда результатов второго запроса тузды в каждую строку (предполагаются, что существуют какие-либо ответы на

{ "comments" : [ { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "More tests....", 
     "display_name" : "admin", 
     "id" : "26", 
     "playtime" : 36.206896551699998, 
     "posttime" : "2011-10-08 11:11:55", 
     "cid" : "26", 
     "songid" : "30", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     "cid": "1", 
     "replies" : [ { "cid" : "26", 
         "body" : "test reply", 
         "posttime" : "2011-10-08 11:11:55" 
         }] 

     }, 

все)

запроса Я хотел бы работать, чтобы вернуть ответы на данный комментарий (связанный как «чид» в двух таблицах) является: -

$sql = "select cp_replies.*,users.user_login, users.user_url, users.display_name, users.ID as avatar 

    from ".$wpdb->prefix."cp_replies cp_replies 
       left join ".$wpdb->prefix."users users on users.ID=cp_replies.uid 
       where cp_replies.cid= $cid 
       order by cp_replies.id asc"; 

$result2 = mysql_query($sql, $gaSql['link']) or die(mysql_error()); 

с переменным $ чида необходимости быть прошедший дин в зависимости от того, какой «cid» для каждой строки для первого запроса. (Надеюсь это имеет смысл).

Я попытался создать отдельную функцию, содержащую запрос, передал ей переменную 'cid' как переменную, но продолжал получать «null», когда пытался получить массив.

Я действительно застрял здесь, ребята, и действительно надеюсь, что кто-то может мне помочь.

РЕДАКТИРОВАТЬ:

Сделав изменения, предложенные Stur, то ясно, что я все ближе, но она по-прежнему не по назначению. Мой JSON (предполагая, что я правильно реализовать свои предложения, теперь выглядит следующим образом: -

{ "comments" : [ { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "comment at 0:48", 
     "display_name" : "admin", 
     "id" : "2", 
     "playtime" : 17.977528089900002, 
     "posttime" : "2011-09-28 14:38:41", 
     "songid" : "24", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     }, 
     { "replies" : { "body" : "haha reply", 
      "cid" : "2", 
      "id" : "1", 
      "posttime" : "2011-09-28 15:14:56", 
      "uid" : "1", 
      "user_login" : "admin" 
      } }, 
     { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "asdasd", 
     "display_name" : "admin", 
     "id" : "3", 
     "playtime" : 0.74906367041199995, 
     "posttime" : "2011-09-28 14:43:11", 
     "songid" : "24", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     }, 
     { "replies" : { "body" : "haha reply", 
      "cid" : "2", 
      "id" : "1", 
      "posttime" : "2011-09-28 15:14:56", 
      "uid" : "1", 
      "user_login" : "admin" 
      } }, 
     { "avatar" : "http://www.songbanc.com/wp-content/uploads/avatars/1/8bb11e958a26913e2c13393014e854d5-bpthumb.jpg", 
     "body" : "test", 
     "display_name" : "admin", 
     "id" : "10", 
     "playtime" : 36.329588014999999, 
     "posttime" : "2011-10-06 14:15:12", 
     "songid" : "24", 
     "uid" : "1", 
     "user_login" : "admin", 
     "user_url" : "http://www.songbanc.com/members/admin/" 
     }, 
     { "replies" : { "body" : "haha reply", 
      "cid" : "2", 
      "id" : "1", 
      "posttime" : "2011-09-28 15:14:56", 
      "uid" : "1", 
      "user_login" : "admin" 
      } } 
    ] } 

Любой строит на этом?

ответ

1
$output['comments'][] = $row; 

Это создает вложенный массив в разделе «комментарии» для каждой строки это петли, так что перед кодированием его JSON структуру массива будет выглядеть примерно так:

$output['comments'][]['id'] = 26; 
$output['comments'][]['songid'] = 30; 

Так что вы хотите разместить ответы на:

$output['comments'][]['replies'] = $replies; 

что бы я сделать, это положить второй запрос в вашем время цикла, а затем сделать это:

while ($replies = mysql_fetch_array($result2, MYSQL_ASSOC)) 
{ 
    $output['comments'][$cid]['replies'][] = $replies; 
} 

И изменение в первом время:

$output['comments'][] = $row; 

в

$output['comments'][$cid] = $row; 
+0

Благодаря Stur, вы определенно на правильном пути, но это не совсем там пока, к сожалению. Теперь я возвращаю ответы, но, похоже, это только первая строка запроса, повторяющаяся для каждой строки цикла while, также они не вложены в объекты комментариев, вместо этого они, похоже, объединяются. Я не уверен, что правильно описываю это, я отредактирую свой вопрос с помощью копии JSON, которую я сейчас получаю. Спасибо за вашу помощь до сих пор! – gordyr

+0

Я обновил свой ответ, если вы используете $ cid в качестве ключа для вложенного массива. А затем проведите через свои ответы и добавьте их в $ output ['comments'] [$ cid] ['replies'] [] ... это должно сработать. – StuR

+0

.. и еще лучше использовать инкрементное значение для ключа, потому что если вы установите ['comments'] [] и ['comments'] [] ['replies'], он создаст два вложенных массива, если вы не определите ключ , – StuR

Смежные вопросы