使用Facebook Graph API获取多帖评论仅返回最后一篇数据的问题
问题:Facebook Graph API仅返回最后一篇帖子的评论数据
我尝试使用Facebook Graph API获取账号下最近2篇帖子的评论,代码可运行,但仅返回第二篇(最后一个数组)的评论数据。预期返回4个用户ID,实际仅返回最后2个。
原代码
$postItems = $postsArray['posts']['data']; foreach ($postItems as $post) { $fullPostId = $post['id']; $comments_number = 10; $facebook_graph_api2 = "https://graph.facebook.com/v2.4/$fullPostId/comments?access_token=$accToken&pretty=1&summary=true&limit=$comments_number&after"; $jsonData = grab_page($facebook_graph_api2,$accCookie); $postDataArrays = json_decode($jsonData, true); $CommentsItems = $postDataArrays['data']; } /** Update Balance Code **/ $toolId = '87637'; @$itemsCount = @count($CommentItems); $toolPrice = toolPrice($toolId)*$itemsCount; $finalBalance = updateBalance($toolPrice); /** Update Balance Code **/ if ($finalBalance) { if (isset($CommentItems)) { echo '{"status":1,"balance":'.$finalBalance.',"message":"Success !","data":"'; foreach($CommentItems as $item) { echo $users = $item['from']['id'].'\n'; } echo '"}'; }elseif( isset($postDataArray['error']) && $postDataArray['error']['code']== 1 ){ $msgError = $postDataArray['error']['message']; echo '{"status":0,"message":"Error !","reason":"'.$msgError.'"}'; }else{ echo '{"status":0,"message":"Error !","reason":"Please Update Your Facebook Access Token"}'; } }else{ echo '{"status":0,"message":"Error !","reason":"You do not have enough funds on balance"}'; }
问题原因
- 核心问题:循环中每次将
$postDataArrays['data']赋值给$CommentsItems时,是直接覆盖而非追加。循环处理第二篇帖子时,会把第一篇的评论数据替换掉,最终只保留最后一篇的评论。 - 其他问题:
- 变量拼写错误:
$postDataArray应为$postDataArrays - 余额计算仅统计最后一篇的评论数,不符合业务逻辑
- 直接拼接JSON字符串容易出现格式错误(比如换行符处理)
- 变量拼写错误:
修正后的代码
// 初始化数组收集所有帖子的评论 $allComments = []; $postItems = $postsArray['posts']['data']; foreach ($postItems as $post) { $fullPostId = $post['id']; $comments_number = 10; $facebook_graph_api2 = "https://graph.facebook.com/v2.4/$fullPostId/comments?access_token=$accToken&pretty=1&summary=true&limit=$comments_number&after"; $jsonData = grab_page($facebook_graph_api2,$accCookie); $postDataArrays = json_decode($jsonData, true); // 检查API返回是否有评论数据,有则追加到总数组 if (!empty($postDataArrays['data'])) { $allComments = array_merge($allComments, $postDataArrays['data']); } // 处理API错误(提前捕获,避免后续逻辑出错) if (!empty($postDataArrays['error'])) { $msgError = $postDataArrays['error']['message']; echo json_encode([ "status" => 0, "message" => "Error !", "reason" => $msgError ]); exit; } } /** Update Balance Code **/ $toolId = '87637'; $itemsCount = count($allComments); $toolPrice = toolPrice($toolId) * $itemsCount; $finalBalance = updateBalance($toolPrice); /** Update Balance Code **/ if ($finalBalance) { if (!empty($allComments)) { // 提取所有用户ID $userIds = array_column($allComments, 'from', 'id'); $userIdsStr = implode("\n", array_keys($userIds)); echo json_encode([ "status" => 1, "balance" => $finalBalance, "message" => "Success !", "data" => $userIdsStr ]); } else { echo json_encode([ "status" => 0, "message" => "Error !", "reason" => "No comments found on posts" ]); } } else { echo json_encode([ "status" => 0, "message" => "Error !", "reason" => "You do not have enough funds on balance" ]); }
修正说明
- 收集所有评论:初始化
$allComments空数组,用array_merge将每篇帖子的评论追加进去,避免数据覆盖。 - 提前处理API错误:循环内直接检查API返回的错误,及时输出错误信息并终止脚本,避免无效计算。
- 修正余额计算:基于所有评论的总数计算费用,符合业务逻辑。
- 规范JSON输出:使用
json_encode生成JSON,避免手动拼接导致的格式问题,同时用array_column高效提取用户ID。
内容的提问来源于stack exchange,提问作者egam321
相关产品推荐
相关产品推荐

