无法使用ajax将多维数组传递给php

无法使用ajax将多维数组传递给php

问题描述:

Array I am trying to pass:

var params = [];
params['request'] = "movies";
params['param'] = [];
params['param']['sortBy'] = "title";
params['param']['sortOrder'] = "asc";

Ajax call:

return $.ajax({
        type: "POST",
        url: "http://192.168.0.100:83/getData.php",
        cache:false,
        data: params,
        dataType:"json",
        success: function(data){
            if(data != null){
                            console.log(data);
                        }

Problem is that the php script only receives $_POST['request'], params is non-existent.

If I view params array in the console log before the ajax call I see this:

[request: "movies", param: Array[0]]
length: 0
param: Array[0]
length: 0
sortBy: "title"
sortOrder: "asc"
__proto__: Array[0]
request: "movies"
__proto__: Array[0]

It seems like the problem could be that "param" parameter is not passed because it is seen as empty (it is not, at least before it is passed to ajax call), but why this is happening I have no idea. What am I missing here?

我试图传递的数组: p>

  var params =  []; 
params ['request'] =“movies”; 
params ['param'] = []; 
params ['param'] ['sortBy'] =“title”; 
params ['param']  ['sortOrder'] =“asc”; 
  code>  pre> 
 
 

Ajax调用: p>

 返回$ .ajax({  
键入:“POST”,
 url:“http://192.168.0.100:83 / getData.php”,
 cache:false,
 data:params,
 dataType:“json”,
  success:function(data){
 if(data!= null){
 console.log(data); 
} 
  code>  pre> 
 
 

问题在于 php脚本只接收$ _POST ['request'],params不存在。 p>

如果我在ajax调用之前在控制台日志中查看params数组,我会看到: p>

  [request:“movies”,param:Array [0]] 
length:0 
param:Array [0] 
length:0 
sortBy:“title”
sortOrder:“asc  “
__proto __:数组[0] 
request:”movies“
__proto__:数组[0] 
  code>  pre> 
 
 

似乎问题可能是“param”参数未被传递,因为它被视为空(它不是,至少在传递给ajax调用之前),但为什么会发生这种情况我不知道。 我在这里缺少什么? p> div>

You have declared params as an array [] but assigned object properties to it using the ["string"] notation. This resulted in empty arrays with additional properties appended to the Array object.

Instead, it should have been declared as an object literal, with another object literal nested inside.

var params = {
  request: "movies",
  param: {
    sortBy: "title",
    sortOrder: "asc"
  }
};

The structure of the $_POST should be something like:

Array
(
    [request] => movies
    [param] => Array
        (
            [sortBy] => title
            [sortOrder] => asc
        )

)

You could send the data as JSON and decode it in php using json_decode():

$.ajax({        
        data: { paramData: JSON.stringify( params),
       /* other ajax options*/

})

Then in php receive it with:

$params= json_decode($_POST['paramData']); 
echo $params['request']; /* should return "movies" as response*/

Include json2.js library for older browsers that don't support JSON methods

EDIT: after a little testing will definitely need to change params to object and params.param to object, Changing [] to {} will accomplish this:

 var params = {};
 params['request'] = "movies";
 params['param'] = {};
 params['param']['sortBy'] = "title";
 params['param']['sortOrder'] = "asc";

DEMO: http://jsfiddle.net/germk/2/