2009-06-10 3 views
3

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

{ "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-объект, все будет хорошо, но если я загружу одну и ту же строку из базы данных и повторю ее, это не сработает.

Update 1: забудьте сказать, что я использую в текстовом поле с utf8_general_ci комплектовке

Update 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-Object.

Обновление 3: Я думаю, что я решил проблему. Некоторые перерыв проник в мой JSON-объект, так что я сделать это, перед выходом:

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

Вы можете использовать Firebug для проверки что ответ от ser ver на самом деле именно то, что вы ожидаете? –

+1

Ах хороший намек (я действительно должен использовать Firebug чаще), и я думаю, что теперь я узнал, в чем проблема. Некоторые перерывы проникают в мой объект, если я это делаю, перед эхом он отлично работает: $ output = str_replace ("\ n", "", $ output); $ output = str_replace ("\ r", "", $ output); $ output = str_replace ("\ r \ n", "", $ output); echo $ output; –

+2

Только совет: $ output = str_replace (array ("\ n", "\ r", "\ r \ n"), "", $ output) –

ответ

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-код должен либо вернуть данные из базы данных или просто эхо его , в зависимости от параметров почты:

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

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

+0

Спасибо за ваш исчерпывающий ответ! Я только что нашел проблему (описал в моем вопросе под «Обновление 3». Но я буду использовать свой путь, если у меня будут проблемы с этим материалом в будущем. –

1

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

+0

Не жалко, забудьте сообщить, что я использую ТЕКСТ -Field с UTF8_general_ci сортировкой –

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

Надеется, что это полезно

Смежные вопросы