2013-11-14 126 views
14

我有一個簡單的PHP文件,解碼我的JSON字符串,傳遞與AJAX,並戳結果,但我不能保持$_POST變量,爲什麼?發佈JSON與jQuery的AJAX到PHP

我試圖檢查fireBug,我可以看到POST請求被正確發送,當腳本被調用時,他向我反應Noooooooob,它似乎設置了任何POST變量。

我要的是有我的數組=)

JSON字符串生成由JSON.stringify

[ 
    { 
     "id":21, 
     "children":[ 
     { 
      "id":196 
     }, 
     { 
      "id":195 
     }, 
     { 
      "id":49 
     }, 
     { 
      "id":194 
     } 
     ] 
    }, 
    { 
     "id":29, 
     "children":[ 
     { 
      "id":184 
     }, 
     { 
      "id":152 
     } 
     ] 
    }, 
    ... 
] 

的JavaScript

$('#save').click(function() { 
    var tmp = JSON.stringify($('.dd').nestable('serialize')); 
    // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...] 
    $.ajax({ 
    type: 'POST', 
    url: 'save_categories.php', 
    dataType: 'json', 
    data: {'categories': tmp}, 
    success: function(msg) { 
     alert(msg); 
    } 
    }); 
}); 

save_categories.php

<?php 
    if(isset($_POST['categories'])) { 
    $json = $_POST['categories']; 
    var_dump(json_decode($json, true)); 
    } else { 
    echo "Noooooooob"; 
    } 
?> 
+0

和螢火蟲這就是你在發送查詢字符串參數? – John

+0

螢火蟲告訴我,類別參數是正確傳遞,但當我訪問$ _POST它找不到。 –

+2

刪除線路回聲「Noooooooob」。 :) – justinkoh

回答

17

你的代碼的工作,只是測試它。

$('#save').click(function() { 
    var tmp = JSON.stringify($('.dd').nestable('serialize')); 
    // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...] 
    $.ajax({ 
    type: 'POST', 
    url: 'save_categories.php', 
    data: {'categories': tmp}, 
    success: function(msg) { 
     alert(msg); 
    } 
    }); 
}); 
+0

這個解決方案正是我的意思,我非常感謝@melc,我還添加了一個preventDefault(),因爲我使用了

0

試試這個:

$('#save').click(function() { 
    var tmp = JSON.stringify($('.dd').nestable('serialize')); 
    // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...] 
    $.ajax({ 
    type: 'POST', 
    url: 'save_categories.php', 
    dataType: 'json', 
    data: 'categories=' + encodeURIComponent(tmp), 
    success: function(msg) { 
     alert(msg); 
    } 
    }); 
}); 

我改變只是這一行:

data: 'categories=' + encodeURIComponent(tmp), 

因爲多數民衆贊成的方式,你怎麼也得有寫入數據。我測試了它,它的工作...

+0

這與操作代碼沒有什麼不同。 jQuery將把對象轉換爲一個字符串,就像你有。關鍵部分可能是URL編碼,而不是以字符串形式傳遞數據屬性。 –

4

數據類型JSON,那麼jQuery的崗位是:

{"categories":"[{\"id\":21,\"children\":[{\"id\":196},{\"id\":195},{\"id\":49},{\"id\":194}]},{\"id\":29,\"children\":[{\"id\":184},{\"id\":152}]},...]"} 

這不是標準urlencoded的,所以$ _ POST是空的。

您可以將數據設置爲您的複雜結構,以及jQuery將正確編碼是:

$('#save').click(function() { 
    $.ajax({ 
    type: 'POST', 
    url: 'save_categories.php', 
    dataType: 'json', 
    data: $('.dd').nestable('serialize'), 
    success: function(msg) { 
     alert(msg); 
    } 
    }); 
}); 

而且在PHP中:如果刪除dataType: 'json'$categories = json_decode(file_get_contents('php://stdin'));

0

它適用於我,你可以試試這個。 的JavaScript

$('#save').click(function() { $.ajax({ type: 'POST', contentType: 'application/json', url: 'save_categories.php', dataType: 'json', data: JSON.stringify({'categories': $('.dd').nestable('serialize')}), success: function(msg) { alert(msg); } }); });

你需要寫上save_categories.php $ _ POST下面的代碼是預先填充表單數據。

要獲取JSON數據(或任何原始輸入),請使用php://輸入。

$json = json_decode(file_get_contents("php://input")); 
$categories = $json->categories;