2009-06-10 98 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); 
} 

希望這是有益