JSON сохранить в базе данных и загрузить с JQuery - PullRequest
3 голосов
/ 10 июня 2009

Я создаю огромный JSON-объект и сохраняю его в своей базе данных. Но когда я загружаю «строку» и отображаю ее в PHP, я не могу получить доступ к объекту JSON в JQuery. Должен ли я что-то учитывать, если я хочу сохранить свой объект JSON в базе данных MySQL (когда я просто создаю массив, а затем отображаю его с помощью «echo json_encode ($ arr)»; он работает нормально, но мне нужно сохранить объект для кеширования).

{"247": {"0": "Это Вопрос " "1": "", "2": "247", "3": "0", "ответы": [[ "Ответ1", "960", "1"], [" Ответ 2" , "962", "0"], [ "Ответ 3" , "961", "0"], [ "Ответ 4 "," 963 "," 0 "]]}, {" 248 ": {" 0 ":" Это Вопрос " "1": "", "2": "247", "3": "0", "ответы": [[ "Ответ1", "960", "1"], [" Ответ 2" , "962", "0"], [ "Ответ 3" , "961", "0"], [ "Ответ 4" , "963", "0"]]}}

только выдержка

Если я просто отображаю этот JSON-объект, все работает нормально, но если я загружаю ту же строку из базы данных и отображаю ее, она не работает.

Обновление 1: забудьте, что я использую поле TEXT с сопоставлением 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);

Ответы [ 3 ]

3 голосов
/ 10 июня 2009

Я бы посоветовал посмотреть, что видит ваш 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, чтобы он либо возвращал данные из базы данных, либо просто выводил их в зависимости от параметров записи:

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

Надеюсь, это поможет!

2 голосов
/ 12 января 2010

Я заставил это работать немного по-другому. Я попытался проиллюстрировать, как это было сделано.

На простом английском языке:

использовать 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 голос
/ 10 июня 2009

Может быть, вы используете поле varchar и ваша строка просто не помещается в 255 символов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...