Php jQuery ajax返回意外的数据类型
试图在非常有用的“handsontable”jscript库中对输入执行一些服务器端错误检查 以下调用非常有效:Php jQuery ajax返回意外的数据类型,php,javascript,jquery,ajax,arrays,Php,Javascript,Jquery,Ajax,Arrays,试图在非常有用的“handsontable”jscript库中对输入执行一些服务器端错误检查 以下调用非常有效: jQuery.ajax({ url: "index.php?option=com_catalogscontroller=batchsave", data: {"formData": querydata.getData().splice( 0, 1 ) }, dataType: 'JSON', type: 'POST', success: functio
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调用。i、 e:
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返回给我的结果令人困惑。分配“alert(formErrors)”后立即显示的警报类似于列表:
true,true,false,true,true
我还可以毫无问题地对特定索引发出警报,例如警报(formErrors[0][2]);将显示“false”。但是在ajax调用之外,数组似乎是不可访问的,会出现“未定义”的错误。无论是在ajax调用中,还是在ajax调用之外的例程中,alert(typeof formErrors)显示“object”,alert(formErrors)给出与上面相同的逗号列表,但我不想要对象,我希望有一个数组,或者我希望有一个对象,只要我可以通过索引访问它。我在这里遗漏了什么?我遇到的问题似乎集中在JSNG上 大多数文档确定了支持Javascript AJAX调用的php例程中对JSON变量的需求。使用jQuery.ajax调用可以减轻一些需求,但是如果您不知道自己在做什么(像我一样),那么很容易遇到麻烦 我的php例程JSON使用以下语句对完整的响应记录进行编码:
return json_encode( $result );
因为我的:
dataType: JSON
在jQuery.ajax()调用中,这将导致PHP例程向jQuery javascript函数返回结果的自动json.parse()。但是,这并不成功,因为服务器代码中的php json_encode调用不是递归的,因此在解码结果数组时,该结果中的任何数组都不是递归的
然后,解决方案是对多维数组的组件进行json编码,然后在客户端对其进行解码。e、 g
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。看看如果使用formErrors=JSON.stringify(response.data.errors)会发生什么;然后警报(formErrors);此警报将给出相同的逗号分隔字符串,该字符串用方括号括起来,即[真、真、假、真、真]服务器端的
$errors
的内容是什么?此外,我建议在调试此类案例时使用console.log
或debugger
;to:formErrors=JSON.parse(JSON.stringify(response.data.errors));对于我来说,这是一个谜,为什么它在直接的初始任务不起作用的情况下起作用;我想这一定是一个典型的问题。@hugolol这很奇怪。但至少现在它能工作了