2013-02-19 62 views
0

這可能看起來像一個愚蠢的問題,但經過漫長的搜索後,我很難過。從JSON內容類型的PHP文件中檢索JSON

我正在使用查詢來檢索數據,然後編碼爲JSON以在我的網站周圍的各個地方使用。只有一個問題。我似乎無法檢索數據!

查詢(data.users.php):

$arr = array(); 

$rs = mysql_query("SELECT 
    CONCAT(m.firstName,' ',m.lastName) AS name, 
    m.email, 
    m.permission, 
    m.costRate, 
    m.dt, 
    m.memberID, 
    m.moduleFinancial, 
    o.orgName 

    FROM members m 

    LEFT JOIN organisations o ON m.organisationID = o.organisationID 
    WHERE status = 'true' 
    ORDER BY name" 
) or die(mysql_error()); 

while($obj = mysql_fetch_object($rs)) { 
$arr[] = $obj; 
} 
header("Content-type: application/json"); 

    echo json_encode($arr); 

的數據的實施例:

[{"name":"Admin User","email":"[email protected]","permission":"admin","dt":"2013-02-02 10:26:29","memberID":"M0000001"},{"name":"Another User","email":"[email protected]","permission":"admin","dt":"2012-02-02 10:26:29","memberID":"M0000002"}] 

任何想法?

更新取出碼:

ob_start(); 
      include("../data/data.users.php"); 
      $arr = json_decode(ob_get_clean(), true); 

      foreach($arr as $item) { 
       if ($item['memberID'] == $_GET["ID"]) { 
        $user_name = $item['name']; 
       } 
      } 
+0

是的,這是正常的 - JSON應該沒有空白,以儘可能緊湊。 – colincameron 2013-02-19 08:38:32

+0

在這種情況下,任何想法顯示數據的代碼有什麼問題? – rrfive 2013-02-19 08:53:00

+0

我認爲@fab已經在下面的答案中得到了答案。 – colincameron 2013-02-19 09:40:59

回答

0
echo json_encode($arr)."\r\n"; 
1

我相信,你的問題在於其他地方,json_decode不需要換行符。然而,我發現這行可疑:

json_decode(file_get_contents("../data/data.users.php"),true); 

你想讀一個PHP腳本爲JSON?這是源代碼,沒有任何東西在那裏執行!

更新:

這正是像我懷疑:你讀的PHP文件,並把它傳遞給json_decode。 PHP源代碼不是有效的JSON,因此它返回nullfile_get_contents僅可能與HTTP包裝:

file_get_contents("http://example.com/data/data.users.php") 

但這是不必要的複雜,通常不是一個好主意。另外,腳本必須位於公共Web目錄下。你應該包括data.users.php。對於這一點,你有兩個選擇:

  1. 變化echoreturn,然後使用:

    $arr = json_decode(include("../data/data.users.php"), true); 
    
  2. 使用輸出緩衝:

    ob_start(); 
    include("../data/data.users.php"); 
    $arr = json_decode(ob_get_clean(), true); 
    

第一個選項應該是但是,如果由於某些原因您不能更改data.users.php ,第二個是有效的解決方法。

P.S:你可能想擺脫調用到header()也一樣,如果data.users.php不會直接通過Web調用。否則,請記住如果第二個腳本沒有將JSON傳遞給瀏覽器/客戶端,那麼請重寫第二個腳本中的content-type標頭。

+0

上面增加了額外的細節。 – rrfive 2013-02-21 09:21:32

+0

答覆已更新。 – 2013-02-21 09:52:33

+0

感謝Fab,它正在測試頁面上工作。唷!還有一個問題。當我將代碼添加到實際頁面時,包含會打破頁面。我已經添加了上面的修改代碼。 – rrfive 2013-02-21 10:19:37

1

試試這個親愛的....

輸入

{"key1":[1,2,3],"key2":"value"} 

輸出

{ 
    "key1": [ 
     1, 
     2, 
     3 
    ], 
    "key2": "value" 
} 

功能代碼:

function prettyPrint($json) 
{ 
    $result = ''; 
    $level = 0; 
    $prev_char = ''; 
    $in_quotes = false; 
    $ends_line_level = NULL; 
    $json_length = strlen($json); 

    for($i = 0; $i < $json_length; $i++) { 
     $char = $json[$i]; 
     $new_line_level = NULL; 
     $post = ""; 
     if($ends_line_level !== NULL) { 
      $new_line_level = $ends_line_level; 
      $ends_line_level = NULL; 
     } 
     if($char === '"' && $prev_char != '\\') { 
      $in_quotes = !$in_quotes; 
     } else if(! $in_quotes) { 
      switch($char) { 
       case '}': case ']': 
        $level--; 
        $ends_line_level = NULL; 
        $new_line_level = $level; 
        break; 

       case '{': case '[': 
        $level++; 
       case ',': 
        $ends_line_level = $level; 
        break; 

       case ':': 
        $post = " "; 
        break; 

       case " ": case "\t": case "\n": case "\r": 
        $char = ""; 
        $ends_line_level = $new_line_level; 
        $new_line_level = NULL; 
        break; 
      } 
     } 
     if($new_line_level !== NULL) { 
      $result .= "\n".str_repeat("\t", $new_line_level); 
     } 
     $result .= $char.$post; 
     $prev_char = $char; 
    } 

    return $result; 
} 

可能這有助於你.... ...