2014-01-06 74 views
4

我正在從我的頁面收集一些數據,將數據存儲在數組中以便在頁面上多次使用,並通過AJAX發送數組副本,將數據存儲在數據庫中一個PHP頁面。數據我存儲在陣列中的打破JSON的HTML字符串( )

其中一幅是TinyMCE的所見即所得的編輯器的輸出,使其包含HTML,但剛剛發現這是一個問題 - 我會解釋:

進入後在我的所見即所得的編輯器一個文本行,我觸發我的AJAX事件,這是我的控制檯上顯示的JSON字符串和一切工作正常,數據庫被髮送和存儲:

{"id":"229","topic":"","title":"","description":"","content":"<p>fgfgfdg.</p>","keywords":""} 

如果我寫了兩行文字,這是JSON字符串並且成功:

{"id":"229","topic":"","title":"","description":"","content":"<p>fgfgfdg.</p>\n<p>fgfgfdg</p>","keywords":""} 

現在,如果我寫一行文本並按回車,而不是在第二行輸入任何內容,我會得到以下失敗。

{"id":"229","topic":"","title":"","description":"","content":"<p>fgfgfdgdfgdfgdfgdfg.</p>\n<p>&nbsp;</p>","keywords":""} 

看來&nbsp;以某種方式破壞了我的JSON輸出。我的PHP無法訪問已解碼的數組值,因爲沒有數組。 print_r(json_decode($json))什麼都不返回。任何人都可以幫忙嗎?

這是我與jQuery的HTML頁面:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

<script> 
var post_data = {}; 

post_data.id = post_id; 
post_data.topic = topic; 
post_data.title = title; 
post_data.description = description; 
post_data.content = tinyMCE.activeEditor.getContent(); 
post_data.keywords = keywords; 

post_data = JSON.stringify(post_data); 

save_post_request = $.ajax({ 
    url: 'ajax/save-post.php', 
    type: 'POST', 
    data: "save_mode="+save_mode+"&post_data="+post_data, 
    dataType: 'text', 
    cache: false 
}); 
</script> 

這是我的PHP頁面:

header('Content-type: application/json; charset=UTF-8'); 

$post_data = isset($_POST['post_data']) ? $_POST['post_data'] : null; 
$post_data_arr = json_decode($post_data, true); 
$post_id = $post_data_arr['id']; 
$topic = $post_data_arr['topic']; 
// others 
$content = $post_data_arr['content']; 

if (!$post_data_arr['id']) { 
    // fails here 
    // id is not accessible when the JSON contains <p>&nbsp;</p> in the 'content' item 
} 

這是螢火蟲說:

enter image description here

+0

什麼事情'的var_dump($ _ POST [ 'post_data'])'說明了什麼?看看JSON在那裏發生了什麼變化。如果是這樣,那麼你的jQuery代碼中的東西是在客戶端 –

+0

@MarcB,感謝您的幫助,但現在感謝Qunetin解決了。喜歡使用'mangled'和'mangling':) – TheCarver

回答

7

您正在將JSON放入一些URL編碼數據,但您不是URL編碼它。

&字符在URL編碼數據(它分隔鍵/值對)中有特殊含義,所以這意味着您正在破壞數據。

使用encodeURIComponent功能,將它添加到字符串之前正確編碼數據:

data: "save_mode="+encodeURIComponent(save_mode)+"&post_data="+encodeURIComponent(post_data), 

但是,因爲你使用jQuery,你不應該在第一手工構建你的URL編碼數據地點。 jQuery可以爲你做。通過data的對象,而不是一個字符串:

data: { 
    save_mode: save_mode, 
    post_data: post_data 
}, 
+0

從已經禿頂的頭上拉出更多的頭髮。爲什麼我沒有想到這個?謝謝,昆汀。 +1的響應時間。 – TheCarver