1

我想将一个数组从我的客户端 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选项,但无济于事。

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

4

6 回答 6

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;
于 2012-12-07T21:11:31.883 回答
1

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

JSON 字符串本身。

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

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

$objJson = json_decode($json);
于 2012-12-07T21:17:24.083 回答
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会将您的数据作为json发布,但实际上dataType内容将定义要获取的预期数据(在调用回调时有一个已经解码的对象)。

于 2012-12-07T21:35:30.663 回答
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));
 }
 });
});
于 2012-12-07T21:36:27.053 回答
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);
于 2012-12-07T21:42:01.677 回答
0

数据不是以 JSON 形式发布的,而是以适当的 HTTP POST 形式发布的。

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

现在,jQuery 很可能会发布这个: namespace=10&namespace=846,它不会被正确地转换为数组。添加方括号应该可以解决这个问题。

于 2012-12-07T21:15:15.527 回答