2009-06-10 6 views
3

Je crée un énorme objet JSON et l'enregistre dans ma base de données. Mais quand je charge la "chaîne" et l'echo en PHP, je ne peux pas accéder à l'objet JSON dans JQuery. Est-ce que je dois considérer quelque chose si je veux sauver mon objet JSON dans une base de données MySQL (quand je crée juste le tableau et puis l'echo avec "echo json_encode ($ arr);" cela fonctionne bien, mais je dois enregistrer l'objet pour la mise en cache).Enregistrer JSON dans la base de données et charger avec JQuery

{ "247": { "0": "Ceci est une question", "1": "", "2": "247", "3": "0", "réponses" : [["Réponse1", "960", "1"], ["Réponse 2", "962", "0"], ["Réponse 3", "961", "0"], [" Réponse 4 "," 963 "," 0 "]]}, {" 248 ": {" 0 ":" Ceci est une question "," 1 ":" "," 2 ":" 247 "," 3 ":" 0 "," réponses ": [[" Réponse1 "," 960 "," 1 "], [" Réponse 2 "," 962 "," 0 "], [" Réponse 3 "," 961" , "0"], [ "réponse 4", "963", "0"]]}}

juste un extrait

Si je fais juste écho à cet objet JSON, tout fonctionne correctement, mais si je charge la même chaîne à partir de la base de données et que je l'envoie en écho, cela ne fonctionne pas.

Mise à jour 1: oublier de dire que je suis sur un champ de texte avec collation utf8_general_ci

Mise à jour 2: Peut-être un peu plus de code:

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

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

     return false; 
    }); 
} 

cela charge le script et devrait alerter "Ceci est une question"

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

?>

c'est le script, où Je charge l'entrée de base de données avec l'objet JSON.

Mise à jour 3: Je pense que j'ai résolu le problème. Certains break infiltrés dans mon JSON-objet si je fais cela, avant la sortie:

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

Peut-on utiliser Firebug pour vérifier que la réponse du ser ver est réellement exactement ce que vous attendez? –

+1

Ah bon indice (je dois vraiment utiliser Firebug plus souvent) et je pense que j'ai maintenant savoir quel est le problème. Certaines cassures se faufilent dans mon objet, si je le fais, avant l'écho, cela fonctionne bien: $ output = str_replace ("\ n", "", $ output); $ output = str_replace ("\ r", "", $ sortie); $ output = str_replace ("\ r \ n", "", $ sortie); echo $ sortie; –

+2

Juste un conseil: $ output = str_replace (array ("\ n", "\ r", "\ r \ n"), "", $ output) –

Répondre

3

Je vous suggère de regarder ce que voit votre javascript. Au lieu de demander jQuery d'interpréter le JSON pour vous, regardez les données brutes:

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

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

     return false; 
    }); 
} 

Par exemple, si une partie de la chaîne se étrangement codé en raison de l'UTF-8, cela pourrait le faire apparaître .

Une fois que vous avez fait cela, si vous ne pouvez toujours pas repérer le problème, essayez ce 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; 
    }); 
} 

Et puis modifiez le code PHP soit renvoyer les données de la base de données ou simplement écho , en fonction des paramètres de poste:

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

Espérons que ça aide!

+0

Merci pour votre réponse complète! Je viens de trouver le problème (décrit dans ma question sous "Mise à jour 3".) Mais je vais utiliser votre chemin si j'ai des problèmes avec ce genre de choses à l'avenir. –

1

Peut-être que vous utilisez varchar champ et votre chaîne ne fonctionne tout simplement pas ma place de 255 caractères?

+0

Non désolé, oubliez de dire que j'utilise un TEXTE -Field avec UTF8_general_ci collation –

2

Je l'ai eu à travailler d'une manière légèrement différente. J'ai essayé d'illustrer comment cela a été fait.

In Plain English:

utilisation urldecode()

Dans le code commenté Fragments

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

Espérons que cela est utile

Questions connexes