通过JSON将数组从jQuery传递给PHP

时间:2012-12-07 21:07:03

标签: php jquery ajax arrays json

我想从我的客户端jQuery代码向我的服务器PHP代码发送一个数组。 在jQuery方面,这就是我正在做的事情:

$.ajax( {
    url: someUrl,
    data: {
       action:  'opensearch',
       search:  query,
       namespace:   [10, 846],
       suggest:     ''
    },
    dataType: 'json',
});

在PHP方面:

echo $params['action'] ."\r\n";
echo $params['namespace'][0] ."\r\n";
echo $params['namespace'][1] ."\r\n";

这个输出是:

opensearch
0

因此,当我设法正确打印字符串时,参数被正确发送。但是,阵列似乎没有正确发送。

我尝试在json_decode选项中使用true,但无效。

任何建议都是最受欢迎的。

6 个答案:

答案 0 :(得分:1)

$.ajax( {
    url: someUrl,
    type:'post'
    data: encodeURIComponent('action=opensearch&search=query&namespace[]=10&namespace[]=846&suggest='),
    dataType: 'json',
});

PHP

$params=json_decode($_POST);
    echo $params->action;

答案 1 :(得分:1)

json_decode()将有效的JSON字符串转换为对象。它每个接受三个参数 其中描述如下:

JSON字符串本身。

可选参数assoc:默认情况下,此值为false。如果改为true,    json_decode会将对象转换为关联数组

深度:JSON字符串中递归结构的最大允许深度。它用了    在PHP 5.3之前是128。 PHP 5.3将此限制增加到512字节默认值。   此参数也是可选的。

$objJson = json_decode($json);

答案 2 :(得分:0)

数据未作为JSON发布,而是以正确的HTTP POST发布。

然而,PHP只会将其转换为字段名称的数组,其结构方式表明它是一个数组。尝试使用namespace: [10, 846]

替换"namespace[]": [10, 846]

目前,jQuery可能会发布这个:namespace=10&namespace=846,它将无法正确转换为数组。添加方括号应该注意这一点。

答案 3 :(得分:0)

您无需解码$_POST变量,实际上$_POST已根据需要包含您的数据。

只需进行测试,使用以下代码创建jsonpost.php:

<?php

    if (count($_POST) > 0)
    {
        header("Content-type: text/plain; charset=utf-8");
        echo nl2br(var_export($_POST, true));
        die();
    }

?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
    </head>
    <body>
        <div id="target"></div>

        <script type="text/javascript">

            $.ajax( {
                url: 'jsonpost.php',
                type:'post',
                data: {
                   action:  'opensearch',
                   search:  'test',
                   namespace:   [10, 846],
                   suggest:     ''
                },
                success: function(data) {
                    $('#target').html(data);
                }
            });

        </script>
    </body>
</html>

这将显示:

array (
  'action' => 'opensearch',
  'search' => 'test',
  'namespace' =>
  array (
    0 => '10',
    1 => '846',
  ),
  'suggest' => '',
)

您的主要错误是您认为dataType POST 您的数据为json,但实际上dataType内容将定义 EXPECTED 要获取的数据(在调用回调时有一个已解码的对象)。

答案 4 :(得分:0)

尝试记录您收到的数据并查看收到的内容,我已使用以下代码测试了您的ajax帖子,并根据需要返回值10:

   $data = $_REQUEST;
   error_log($data['namespace'][0]."\n",3,"log.txt");
   print_r($data['namespace'][0]);

还可以使用,错误和成功选项来查看从php脚本中获得的响应

   $.ajax( {
   url: 'rec.php',
   data: {
      action:  'opensearch',
      search:  "abc",
      namespace:   [10, 846],
      suggest:     ''
   },
   dataType: 'json',
   error: function (XMLHttpRequest, textStatus, errorThrown) {
    console.log(JSON.stringify(XMLHttpRequest));
    console.log(JSON.stringify(textStatus));
    console.log(JSON.stringify(errorThrown));

  },
  success: function (data) {
   console.log(JSON.stringify(data));
 }
 });
});

答案 5 :(得分:0)

您正在发送表单数据,因此它不会是json_encoded。

$.ajax( {
    url: someUrl,
    data: {
        json_string: JSON.stringify({
            action:  'opensearch',
            search:  query,
            namespace:   [10, 846],
            suggest:     ''
        })
    },
    dataType: 'json',
});

然后在PHP端

$data = json_decode($params['json_string'], true);