将JSON保存在数据库中并使用JQuery加载

3
我创建了一个庞大的JSON对象并将其保存在数据库中。但是当我在PHP中加载“字符串”并将其输出时,我无法在JQuery中访问JSON对象。如果我想将我的JSON对象保存在MySQL数据库中(当我只创建数组并用“echo json_encode($arr);”来输出它时,它可以正常工作,但我需要保存对象以进行缓存),那么我需要考虑什么吗?

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

只是一小部分内容

如果我只是输出这个JSON对象,一切都正常,但是如果我从数据库中加载相同的字符串并将其输出,则不起作用。

更新1:忘记告诉您我正在使用UTF8_general_ci排序的TEXT字段

更新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);

你能使用Firebug检查服务器的响应是否确实与你期望的完全一致吗? - Tom Haigh
1
啊,好提示(我真的要更经常地使用Firebug),我想我现在已经找到问题所在了。一些换行符潜入了我的对象中,如果在echo之前执行以下操作,则可以正常工作:$output = str_replace("\n", "", $output); $output = str_replace("\r", "", $output); $output = str_replace("\r\n", "", $output);echo $output; - Christian Strang
2
只是一个小提示:$output = str_replace(array("\n", "\r", "\r\n"), "", $output) - Darren Newton
3个回答

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代码更改为根据POST参数从数据库返回数据或直接输出数据:

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

希望这能有所帮助!

感谢您的全面回答!我刚刚找到了问题(在我的问题下“更新3”中描述)。但如果将来遇到这个问题,我会使用您的方法。 - Christian Strang

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

希望这对你有所帮助


1

也许你使用了 varchar 字段,但你的字符串超过了 255 个字符的限制?


不好意思,忘了告诉你我在使用一个UTF8_general_ci排序规则的TEXT字段。 - Christian Strang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接