Php jQuery ajax返回意外的数据类型

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

试图在非常有用的“handsontable”jscript库中对输入执行一些服务器端错误检查

以下调用非常有效:

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这很奇怪。但至少现在它能工作了