2016-08-06 75 views
0

我查詢PostgreSQL中3表和結果轉換成嵌套JSON對象。我使用PHP(和Slim框架)作爲我的應用程序代碼。我能夠使用PostgreSQL的內置json運算符返回一個有效的嵌套JSON對象。但是,我無法在PHP中渲染該JSON對象。顯示的PostgreSQL JSON在PHP

PHP的json_encode運算符似乎試圖對提供的obect(已經是JSON格式)執行JSON轉換。 我無法讓PHP簡單地回顯,打印(或打印出)PostgreSQL提供的有效結果。 PHP不斷增加額外的字符,結果....我已經試過:

  • (一)不使用PostgreSQL的JSON運營商,
  • (b)使用PHP的json_decode使用json_encode之前,
  • (三)只運行回聲和print_r的聲明,並
  • (d)我剛開始使用str_replace函數來去除多餘的字符玩弄,但開始感覺到scuzzy ...

我敢我確定做明顯錯誤的事情。我只是在這一個停滯。任何幫助是極大的讚賞!

3個表格是: 1.公司 2.聯繫 3.產品圖

CONTACT> ----(:COMPANY_ID)-----公司----(:COMPANY_ID )----- < PIC

(一個公司可以有多個聯繫人,可以有很多圖片...沒有關係的b/W的接觸和PIC表)

這裏PHP代碼,它使用PostgreSQL查詢:

<?php 

$app->get('/companies/{id}', function($request) 
{ 
$db = pg_connect("host=localhost dbname=cool_db_name user=postgres") 
       or die('Could not connect: ' . pg_last_error()); 

    $id = $request->getAttribute('id'); 

    $query = " 

    SELECT row_to_json(t) 
    FROM (
     SELECT company_id, company_name, company_street, company_city, company_state, company_zip, active_ind 

     , (
     SELECT array_to_json(array_agg(row_to_json(c))) 
     FROM (
      SELECT ct.contact_id, ct.contact_lname, ct.contact_fname, ct.contact_email, ct.active_ind 
      FROM contact ct 
      WHERE ct.company_id = c.company_id 
      ORDER by ct.contact_lname 
     ) c 
     ) AS contacts 

     , (
      SELECT array_to_json(array_agg(row_to_json(p))) 
      FROM (
      SELECT p.pic_id, p.pic_location, p.active_ind 
      FROM pic p 
      WHERE p.company_id = c.company_id 
      AND p.active_ind = 1 
      ORDER by p.pic_id 
     ) p 
     ) AS pics 

     FROM company c 

     WHERE c.alive_ind = 1 AND c.company_id = " . $id . " 
    ) t 
    ;"; 


    $result = pg_query($db, $query); 

    while($row = pg_fetch_assoc($result)) 
    { 
     $data[] = $row; 
    } 

    if(isset($data)) 
    { 
     header('Content-Type: application/json'); 
     echo json_encode($data); 
    } 
}); 

1同樣地,如果餘運行本身PostgreSQL的查詢,其結果是有效的JSON(下圖):

{ 「COMPANY_ID」 :1, 「COMPANY_NAME」: 「公司#1」, 「company_street」: 「111樂大道」, 「company_city」: 「的Creve心」, 「company_state」: 「MO」, 「company_zip」:「 10002「, 」active_ind「:1, 「接觸」:[{ 「CONTACT_ID」:1, 「contact_lname」: 「菲吉斯」, 「contact_fname」: 「西里爾」, 「CONTACT_EMAIL」: 「[email protected]」, 「active_ind」:1 },{ 「contact_id」:2, 「contact_lname」:「Kane」, 「contact_fname」:「Lana」, 「contact_email」:「lana @ gmail。COM」, 「active_ind」:1 },{ 「CONTACT_ID」:3, 「contact_lname」: 「Tunt」, 「contact_fname」: 「謝麗爾」, 「CONTACT_EMAIL」: 「[email protected]」 , 「active_ind」:1 }], 「圖片」:[{ 「pic_id」:1, 「pic_location」: 「簡檔/ pic_900.jpg」, 「active_ind」:1 },{ 「 pic_id「:2, 」pic_location「:」profile/pic_901.jpg「, 」active_ind「:1 },{ 」pic_id「:3, 」pic_location「:」profile/pic_902.jpg「 , 「active_ind」:1 },{ 「pic_id」:4, 「pic_location」: 「簡檔/ pic_903.jpg」, 「active_ind」:1 }] }

(抱歉窮人格式...它看起來在jsonlint.com更好)

2. ......但是當我運行PHP應用程序中我得到以下結果(WEIRD JSON)相同的查詢:

[{「row_to_json」: 「{\」company_id \「:1,\」company_name \「:\」Company#1 \「,\」company_street \「:\」111 Fun Ave \「,\」company_city \「:\」Creve Coeur \ ,\ 「company_state \」:\ 「MO \」,\ 「company_zip \」:\ 「10002 \」,\ 「active_ind \」:1,\ 「聯繫人\」:[{\ 「CONTACT_ID \」:1,\ 「contact_lname \」:\ 「菲吉斯\」,\ 「contact_fname \」:\ 「西里爾\」,\ 「CONTACT_EMAIL \」:\ 「[email protected] \」,\ 「active_ind \」:1},{\ 「CONTACT_ID \」:2,\ 「contact_lname \」:\ 「凱恩\」,\ 「contact_fname \」:\ 「拉納\」,\ 「CONTACT_EMAIL \」:\ 「[email protected] \」,\「active_ind \ 「:1},{\」 CONTACT_ID \ 「:3,\」 contact_lname \ 「:\」 Tunt \ 「\ 」contact_fname \「:\ 」謝麗爾\「,\ 」CONTACT_EMAIL \「:\」 瘋狂@的Gmail .COM \ 「\ 」active_ind \「:1}],\ 」圖片\「:[{\ 」pic_id \「:1,\ 」pic_location \「:\ 」簡檔/ pic_900.jpg \「,\」 active_ind \ 「:1},{\」 pic_id \ 「:2,\」 pic_location \ 「:\」 簡檔/ pic_901.jpg \」,\ 「active_ind \」:1},{\ 「pic_id \」:3,\ 「pic_location \」:\ 「簡檔/ pic_902.jpg \」,\ 「active_ind \」:1},{\ 「pic_id \」:4,\ 「pic_location \」:\ 「簡檔/ pic_903.jpg \」,\ 「active_ind \」:1}]}「}}

就像我說的,我現在虧本了。任何幫助將不勝感激。謝謝!

回答

0
header('Content-Type: application/json'); 
$noSlashes = str_replace("\\","",$data); /* no need for json_encode() */ 
$hope = array_values($noSlashes[0]); 
foreach($hope as $key => $value) 
{ 
    print $value; 
} 
+0

儘管這段代碼可以解決這個問題,[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers )真的有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! –

1

所以,使用最後轉義的數據格式,你可以這樣做:

$noSlahes = str_replace("\", "", $yourEscapedJsonString); 

這消除了斜線,什麼也沒有替換它們。現在:

$jsonObject = json_decode($noSlahes); 

然後,選擇rowToJson爲它等同於您的格式正確的JSON:

echo $jsonObject->row_to_json; 
+0

我結束了下面的解決方案去......但你json_decode()提示把我放在array_values()軌道上。如果您加入我的修改,我會將您的答案標記爲正確。 – bjones1831

+0

並感謝您的幫助!自昨天下午以來我一直在採訪這件事! – bjones1831

+0

哈哈,你已經解決了!把你自己的標記爲正確的答案:) –