2009-06-10 56 views
3

我创建了一个巨大的JSON对象并将其保存在我的数据库中。但是当我加载“字符串”并在PHP中回显时,我无法访问JQuery中的JSON对象。如果我想将我的JSON对象保存在MySQL数据库中(当我刚刚创建数组,然后用echo“echo json_encode($ arr);”它工作正常,但我需要保存对象用于缓存)。JSON保存在数据库中并使用JQuery加载

{ “247”:{ “0”: “这是一个 问题”, “1”: “”, “2”: “247”, “3”: “0”, “回答” :[[回答1,960,1,],回答 4“,”963“,”0“]],{”248“:{”0“:”这是一个 问题“,”1“:”“,”2“:”247“ 3“:”0“,”答案“:[[”Answer1“,”960“,”1“],[”Answer 2“,”962“,”0“],[”Answer 3“ 961" , “0”],[ “回答 4”, “963”, “0”]]}}

只是一个摘录

如果我只是回应这个JSON对象,一切工作正常,但如果我从数据库中加载相同的字符串并回显它,它不起作用。

更新1:忘了告诉我使用文本场与UTF8_general_ci整理

更新2:多也许一点点代码:

function start() { 
    $(".start").click(function() { 

     $.post("load_script.php", { }, function(data){ 
      alert(data[247][0]); 
     }, "json"); 

     return false; 
    }); 
} 

这个加载脚本,并应警惕“这是一个问题”

<?php 
require_once('connect.php'); 

$ergebnis = mysql_query("SELECT text FROM cache_table ORDER BY RAND() LIMIT 1"); 
while($row = mysql_fetch_object($ergebnis)) { 
    $output = $row->text; 
} 

echo $output; 

?>

这是脚本,其中我使用JSON对象加载数据库条目。

更新3: 我想我解决了这个问题。一些突破潜入我的JSON-对象,所以我做到这一点,在输出之前:

$output = str_replace("\n", "", $output); 
$output = str_replace("\r", "", $output); 
$output = str_replace("\r\n", "", $output); 
+0

您可以用Firebug检查来自服务器的响应ver实际上正是你所期待的? – 2009-06-10 12:02:22

+1

好的提示(我真的必须更频繁地使用Firebug),我想我现在已经找出问题所在。如果我这样做,在echo之前,它会正常工作: $ output = str_replace(“\ n”,“”,$ output); $ output = str_replace(“\ r”,“”,$ output); $ output = str_replace(“\ r \ n”,“”,$ output); echo $ output; – 2009-06-10 12:10:24

+2

只是一个提示:$ output = str_replace(array(“\ n”,“\ r”,“\ r \ n”),“”,$ output) – 2009-06-10 12:20:25

回答

3

我建议看看你的JavaScript看到什么。不要问jQuery来解释你的JSON,看看原始数据:

function start() { 
    $(".start").click(function() { 

     $.post("load_script.php", { }, function(data){ 
       alert(data); 
     }, "text"); 

     return false; 
    }); 
} 

例如,如果字符串的一部分被奇怪的编码,因为UTF-8的,这可能导致其出现。

一旦你做到了这一点,如果你仍然不能发现问题,请尝试以下代码:

var data1, data2; 
function start() { 
    $(".start").click(function() { 

     $.post("load_script.php", {src: "db" }, function(data){ 
       data1 = data; 
     }, "text"); 

     $.post("load_script.php", {src: "echo" }, function(data){ 
       data2 = data; 
     }, "text"); 

     if (data1 == data2) { 
      alert("data1 == data2"); 
     } 
     else { 
      var len = data1.length < data2.length ? data1.length : data2.length; 
      for(i=0; i<len; ++i) { 
       if (data1.charAt(i) != data2.charAt(i)) { 
       alert("data1 first differs from data2 at character index " + i); 
       break; 
       } 
      } 
     } 

     return false; 
    }); 
} 

,然后更改PHP代码从数据库返回的数据,或简单地echo它,这取决于后期参数:

<?php 
    if ($_POST['src'] == 'db')) { 
     require_once('connect.php'); 

     $ergebnis = mysql_query("SELECT text FROM cache_table ORDER BY RAND() LIMIT 1"); 
     while($row = mysql_fetch_object($ergebnis)) { 
     $output = $row->text; 
     } 
    } 
    else { 
     $output = '{"247":{"0":"This is a question","1":"","2":"247","3":"0","answers":[["Answer1","960","1"],["Answer 2","962","0"],["Answer 3","961","0"],["Answer 4","963","0"]]},{"248":{"0":"This is a question","1":"","2":"247","3":"0","answers":[["Answer1","960","1"],["Answer 2","962","0"],["Answer 3","961","0"],["Answer 4","963","0"]]}}'; 
    } 

echo $output; 
?> 

希望有帮助!

1

也许你使用VARCHAR领域和你的字符串只是不适合在255个字符?

2

我得到了这个以稍微不同的方式工作。我试图说明这是如何完成的。

用简单的英语:

使用urldecode()

在注释代码片段

$json = $this->getContent($url); // CURL function to get JSON from service 
$result = json_decode($json, true); // $result is now an associative array 

... 

$insert = "INSERT INTO mytable (url, data) "; 
$insert .= "VALUES('" . $url . "', '" . urlencode(json_encode($result)) . "') "; 
$insert .= "ON DUPLICATE KEY UPDATE url=url"; 

... 

/* 
** Figure out when you want to check cache, and then it goes something like this 
*/ 

$sqlSelect = "SELECT * FROM mytable WHERE url='" . $url . "' LIMIT 0,1"; 

$result = mysql_query($sqlSelect) or die(mysql_error()); 
$num = mysql_numrows($result); 

if ($num>0) { 
    $row = mysql_fetch_assoc($result); 
    $cache = json_decode(urldecode($row['data']), true); 
} 

希望这是有益