2010-03-03 49 views
3

json_decode我試圖通過jquery.ajax() JavaScript對象傳遞給PHP腳本,基本上是:要JSON和PHP和JavaScript

var bigArray = new Object(); 
//Dode 
//Start loop 
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i}; 

所以這幾乎是這些對象的數組。

var anotherTest = $.toJSON(bigArray); 
    var ajxFile = "routineajax.php"; 
    $.ajax({ 
     type: 'POST', 
     processData: false, 
     url: ajxFile, 
     data: anotherTest, 
     success: function(data) { 
      $('#result').html(data); 
      alert('Load was performed.'); 
     } 
    }); 
}); 

的PHP端腳本

print_r($_POST); 
$params = json_decode($_POST); 
print_r($params) 

AJAX調用正在經歷,我可以在Firebug看到,但print_r($_POST)將返回一個空數組。如果我在$.ajax函數和PHP腳本中將它更改爲$_GET,它就可以工作。我的主要問題是我收到此錯誤信息:

警告:json_decode()預計參數1是字符串數組中

給出如何解決這個問題?


加入這個片段到PHP文件後

$data = file_get_contents('php://input'); 
    var_dump($data); 
    var_dump(json_decode($data)); 

我得到這個輸出

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)` 
    object(stdClass)[2] 
     public '0' => 
     object(stdClass)[4] 
      public 'name' => string 'Decline Abs' (length=11) 
      public 'id' => string '54' (length=2) 
      public 'order' => int 0 
      public 'set' => string '' (length=0) 
      public 'inc' => string '' (length=0) 
      public 'example' => string '' (length=0) 
      public 'day' => int 1 

所以,至少它會通過,我不知道如何訪問它雖然,在正確的方向邁出的一步!

+0

你可以用print_r($ _ GET)的結果編輯你的問題。我看到你在下面,但我不清楚。 – notJim 2010-03-05 00:15:21

回答

3

我認爲問題是通常POST數據發送編碼爲key=value&key2=value2,你發送它爲JSON。嘗試訪問原始發佈數據如下:

$data = file_get_contents('php://input'); 
var_dump($data); 
var_dump(json_decode($data)); 

並看看是否有效。如果沒有,請在問題中張貼它返回的內容,如果有的話。


根據下面的評論和對OP的補充。

var_dump$data複製粘貼是否正確?我問的原因是:string'{"0"{"name"對我來說看起來不合適。這不是有效的JSON或正確編碼的POST字符串。可能是因爲某些字符在複製和粘貼時被編碼。

無論採用哪種方式,您現在都可以獲得所需的結果。 stdClass只是一個空白容器,它將數據放入,您可以使用普通對象語法訪問該容器。在這種情況下,你必須做$data->{0}->name我認爲,因爲0。如果你做$data = json_decode($data, true)它將是一個關聯數組,你可以訪問POST'ed數據爲$data[0]['name']

如果您想繼續探索此操作,在執行ajax請求之前顯示執行window.console.dir(data)的結果可能會有所幫助,並確保您在查看要複製和粘貼的頁面的源時var_dump(data)window.console.dir(data)將在Firebug窗口中顯示data的屬性(您正在使用Firebug,對吧?)。它也可以在Chrome的調試器中工作,也可以在其他工具中使用。就像我說的那樣,看起來你可能已經獲得了你所需要的東西,所以調查是沒有必要的。

+0

我加在OP的輸出。這似乎是移動現在朝正確的方向發展,你能解釋一下嗎?還在繼續嗎? – mike 2010-03-05 05:45:21

+0

看到我上面的添加。 – notJim 2010-03-05 19:29:40

+0

因此,如果你不熟悉stdclass,那麼你可能會遇到以下問題:http://stackoverflow.com/questions/931407 – notJim 2010-03-05 22:39:03

0

難道不夠清楚嗎? json_decode()期望參數一是字符串,而不是數組。但$_POST$_GET始終是陣列。您可以將此數組的成員傳遞給json_decode()

要看到一個數組的內容,使用此片段:

echo "<pre>"; 
print_r($_GET); 
echo "</pre>"; 
+0

我認爲問題出在toJSON,因爲這是我得到的$ _GET輸出: Array([{「0」:{「name」:「Bent_Over_Rows」,「id」:「27」,「order」: 0,「set」:「」,「inc」:「」,「example」:「」,「day」:1}}] =>) 而不是0 =>元素。但至少數組錯誤消失... – mike 2010-03-03 21:46:02

+0

任何想法爲什麼$ _POST沒有出現在print_r中? – mike 2010-03-03 22:09:25

0

打開processData爲true。我不相信你的JSON正確傳遞。另外請注意,它不會以json的形式出現,而是您的JSON的關鍵值對將在您遇到它時是$_POST的內容。

另外,您的bigArray的值是否可以輕鬆轉換爲字符串?如果你傳遞DOM元素或其他東西,你會遇到問題。

+0

打開processData,仍然PHP不拾取$ _POST。我知道這是因爲我在這裏看到它在螢火蟲︰ Parametersapplication/x-www-form-urlencoded {「0」:{「name」:「Decline Abs ... \t 只有$ _GET已經通過.. – mike 2010-03-03 22:54:16

+0

儘量不要將bigArray轉換爲JSON jQuery.ajax()無論如何都需要一個數據參數的對象:http://api.jquery.com/jQuery.ajax/ – UltimateBrent 2010-03-04 00:49:47

+0

通過POST發送bigArray給我這個 陣列 ( [0] => [對象的對象] [1] => [對象的對象] ) 所以好像它沒有穿過對象。 – mike 2010-03-04 02:26:31