2013-02-19 50 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; 
} 

可能这有助于你.... ...