2009-06-10 8 views
3

Ich erstelle ein riesiges JSON-Objekt und speichere es in meiner Datenbank. Aber wenn ich die "Zeichenkette" lade und sie in PHP widerlege, kann ich nicht auf das JSON-Objekt in JQuery zugreifen. Muss ich etwas berücksichtigen, wenn ich mein JSON-Objekt in einer MySQL-Datenbank speichern möchte (wenn ich das Array erst erstelle und dann mit "echo json_encode ($ arr);" echo), funktioniert es gut, aber ich muss das Objekt speichern zum Caching).JSON in der Datenbank speichern und mit JQuery laden

{ "247": { "0": "Das ist eine Frage", "1": "", "2": "247", "3": "0", "Antworten" : [["Answer1", "960", "1"], ["Antwort 2", "962", "0"], ["Antwort 3", "961", "0"], [" Antwort 4 "," 963 "," 0 "]]}, {" 248 ": {" 0 ":" Dies ist eine Frage "," 1 ":", "2": "247", " 3 ":" 0 "," Antworten ": [[" Answer1 "," 960 "," 1 "], [" Answer 2 "," 962 "," 0 "], [" Answer 3 "," " 961" , "0"], [ "Antwort 4", "963", "0"]]}}

nur ein Auszug

Wenn ich nur dieses JSON-Objekt widerspreche, funktioniert alles gut, aber wenn ich die gleiche Zeichenfolge aus der Datenbank lade und es echo, funktioniert es nicht.

Update 1: vergessen zu sagen, dass ich

-Update ein TEXT-Feld mit utf8_general_ci Sortierungs bin mit 2: Vielleicht ein bisschen mehr Code:

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

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

     return false; 
    }); 
} 

dies das Skript lädt und sollte alarmieren "das ist eine Frage"

<?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; 

?>

Dies ist das Skript, in dem Ich lade den Datenbankeintrag mit dem JSON-Objekt.

Update 3: Ich denke, dass ich das Problem gelöst habe. Einige Pause schlich sich in meine JSON-Objekt, so kann ich dies tun, vor der Ausgabe:

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

Sie Firebug können Sie überprüfen, dass die Antwort von der ser Was ist eigentlich genau das, was Sie erwarten? –

+1

Ah guter Hinweis (Ich muss Firebug öfter verwenden) und ich denke, ich habe jetzt herausgefunden, was das Problem ist. Einige Unterbrechungen schleichen sich in mein Objekt ein, wenn ich dies vor dem Echo mache, funktioniert es einwandfrei: $ output = str_replace ("\ n", "", $ output); $ output = str_replace ("\ r", "", $ output); $ output = str_replace ("\ r \ n", "", $ output); echo $ output; –

+2

Nur ein Tipp: $ output = str_replace (array ("\ n", "\ r", "\ r \ n"), "", $ output) –

Antwort

3

Ich schlage vor zu sehen, was Ihr Javascript sieht. Stattdessen jQuery zu fragen, die json für Sie, haben einen Blick auf die Rohdaten zu interpretieren:

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

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

     return false; 
    }); 
} 

Zum Beispiel, wenn ein Teil der Zeichenfolge seltsam wegen der UTF-8 codiert wird, verursachen diese könnte es erscheinen .

Sobald Sie das getan haben, wenn Sie immer noch das Problem nicht erkennen können, versuchen Sie diesen Code:

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; 
    }); 
} 

Und dann den PHP-Code entweder ändern, um die Daten aus der Datenbank zurückgeben oder einfach echo , abhängig von den Post-Parametern:

<?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; 
?> 

Hoffe, dass hilft!

+0

Danke für Ihre umfassende Antwort! Ich habe gerade das Problem gefunden (in meiner Frage unter "Update 3" beschrieben). Aber ich werde deinen Weg nutzen, wenn ich in Zukunft Probleme mit diesen Sachen habe. –

1

Vielleicht verwenden Sie varchar Feld und Ihre String passt einfach nicht in 255 Zeichen?

+0

Es tut mir leid, vergiss zu sagen, dass ich einen TEXT benutze -Feld mit UTF8_general_ci Sortierung –

2

Ich habe das auf eine etwas andere Art und Weise zu arbeiten. Ich habe versucht zu veranschaulichen, wie das gemacht wurde.

In Plain English:

Verwendung urldecode()

In Code-Fragmente kommentiert

$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); 
} 

Hope this hilfreich

Verwandte Themen