2013-09-10 109 views
0

試圖在非常有用的「可移植」jscript庫中實現一些服務器端錯誤檢查輸入。jQuery ajax返回意外數據類型

以下調用的偉大工程:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
type: 'POST', 
    success: function (response) { 
    if(response.success) { 
    } else { 
    querydata.loadData(response.data); 
    } 
} 
}); 

我想到了就去做錯誤檢查是最有效的方法是在服務器(PHP)側,創建一個多維數組來跟蹤服務器發現的任何錯誤,然後用相同的ajax調用中的表單數據返回該數組。所以我修改了服務器代碼,將表單數據和錯誤數組返回給javascript ajax調用。即:

if(!empty($errors)) // $errors is an multi dimensional array same size as the form data 
    $result['success'] = false; 
    $result['msg'] = 'There were errors detected'; 
    $result['data']['form'] = $formData; 
    $result['data']['errors'] = $errors; 
} 
echo json_encode($result); 

,然後在客戶端中,JavaScript例程上述已被修改爲:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
    type: 'POST', 
    success: function (response) { 
    if(response.success) { 
    } else { 
      formErrors = response.data.errors; // formErrors is a global 
    querydata.loadData(response.data.form); 
    } 
} 
}); 

形式的原始功能被保留(表格數據被檢索並在正確插入HTML),但formErrors返回給我的結果是莫名其妙。轉讓後,立即提醒「警報(formErrors)」顯示類似的列表:

true,true,false,true,true 

,我如能也警告在一個特定的指標沒有問題alert(formErrors [0] [2]);會顯示'假'。但在ajax調用之外,該數組似乎無法訪問,導致「未定義」錯誤。並且在ajax調用和ajax調用alert(typeof formErrors)之外的例程中都顯示'object'並且alert(formErrors)提供了與上面相同的逗號列表,但我不想要一個對象,我期待數組或者只要我可以通過索引訪問它,我就會對一個對象感到滿意。我在這裏錯過了什麼?

+0

看看會發生什麼,如果你使用formErrors = JSON.stringify(response.data.errors);然後alert(formErrors); –

+0

該警報給出了用方括號括起來的相同的逗號分隔字符串,即[true,true,false,true,true] – hugo

+0

服務器端的'$ errors'的內容是什麼?另外,我建議在調試像這樣的情況下使用'console.log'或'debugger'。 – pdoherty926

回答

1

我遇到的問題似乎是圍繞着JSONing。

大多數文檔在支持Javascript AJAX調用的PHP例程中標識對JSON變量的需求。 jQuery.ajax調用的使用緩解了一些需求,但是如果你不知道自己在做什麼(像我一樣),它很容易陷入困境。

我的PHP程序編碼JSON用下面的語句完整的響應記錄:

return json_encode($result); 

因爲我的:在jQuery.ajax()調用

dataType: JSON 

參數,這導致在自動json.parse()由PHP例程返回給jQuery javascript函數的結果。這是不成功的,因爲服務器代碼中的php json_encode調用不是遞歸的,所以當解碼結果數組時,結果中的任何數組都不是。

解決方案然後是json對多維數組的組件進行編碼,然後在客戶端解碼它們。例如

if(!empty($errors)) 
    $result['success'] = false; 
    $result['msg'] = 'There were errors detected'; 
    $result['data']['form'] = json_encode($formData); 
    $result['data']['errors'] = json_encode($errors); 
} 
echo json_encode($result); 

然後在客戶端,解析(解碼)這些數組明確:

jQuery.ajax({ 
    url: "index.php?option=com_catalogscontroller=batchsave", 
    data: {"formData": querydata.getData().splice(0, 1) }, 
    dataType: 'JSON', 
    type: 'POST', 
    success: function (response) { 
     if(response.success) { 
     } else { 
      formErrors = JSON.parse(response.data.errors); // formErrors is a global 
      querydata.loadData(JSON.parse(response.data.form)); 
     } 
    } 
}); 

我坦白承認,我真的不知道我在做什麼,但上述構成的代碼似乎對我開發解釋它的邏輯有意義,它對我有用。不管怎樣,再次感謝Nathan和pdoherty926。