2014-02-25 56 views
0

我返回一個JSON文件是這樣的:如何正確地格式化PDO :: FETCH_NUM成JSON結果

ug_gpid: [[4], [2], [3]] 

這不是預期的格式,我想這樣的:

ug_gpid: [4, 2, 3] 

這是我的代碼:

​​

我,結果存儲到$ugroup。我怎樣才能達到理想的輸出?

+0

考慮在'catch'塊中返回一個HTTP錯誤狀態碼(4xx/5xx)。這樣,任何API客戶端都可以更好地捕獲錯誤 – Phil

回答

2

問題是PDOStatement::fetchAll返回一個數組數組。你想建立一個單一數值的平面數組。

我會用這個代替...

$stmt = $db->prepare($sql); 
$stmt->bindParam(':id', $us_id); 
foreach ($user as $item => $value) { 
    $newUser[$item] = $value; 
    $us_id = $value['us_id']; // this is for the bind 
    $stmt->execute(); 
    while ($gpid = $stmt->fetchColumn()) { 
     $newUser[$item]['ug_gpid'][] = $gpid; 
    } 
} 
+0

這隻會返回'[4]'而不是'[4,2,3]' – Muhaimin

+0

@MuhaiminAbdul糟糕,我稍微誤解了您的代碼。現在應該修復 – Phil

+0

謝謝你@phil。我修改了一下你的代碼。你節省了我的一天..再次感謝 – Muhaimin

1

它之所以沒有如預期的那樣已經回答工作;然而,這將是更有效地使用一個單一的查詢:

$sql = sprintf(
    "SELECT ug_usid, GROUP_CONCAT(ug_gpid) 
     FROM user_group 
     WHERE ug_usid IN (%s) AND ug_status = 1 
     GROUP BY ug_usid", 
    str_pad('?', count($user) * 2 - 1, ',?'); 
); 

// ... 

// run query and build search result map 
$stmt = $db->prepare($sql); 
$stmt->execute(array_column($user, 'us_id')); 
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); 

// extend user information with search results 
array_walk($user, function(&$u) use ($groups) { 
    if (isset($groups[$user['us_id']])) { 
     $u['ug_gpid'] = explode(',', $groups[$user['us_id']]); 
    } else { 
     $u['ug_gpid'] = []; 
    } 
}); 

echo json_encode($user, JSON_NUMERIC_CHECK); 

注意,它假設你使用MySQL作爲數據庫引擎,因爲它使用GROUP_CONCAT這是SQL的MySQL擴展。

+0

謝謝@Jack。你的比菲爾的稍長一些。除非你說你的表現更好。再次感謝 – Muhaimin

+0

@MuhaiminAbdul從理論上講,性能應該比多個查詢更好,但只有基準會給出最終結論。 –

+0

我真的很想看到一個基準。我有一種感覺,數組中涉及的額外處理時間和字符串函數可能會降低單個查詢的好處。準備好的語句經過優化,最終在循環中運行 – Phil