【问题标题】:Passing an array from jQuery to PHP via JSON通过 JSON 将数组从 jQuery 传递到 PHP
【发布时间】:2012-12-07 21:07:02
【问题描述】:

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

欢迎提出任何建议。

【问题讨论】:

    标签: php jquery ajax arrays json


    【解决方案1】:

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

    JSON 字符串本身。

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

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

    $objJson = json_decode($json);
    

    【讨论】:

      【解决方案2】:
      $.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;
      

      【讨论】:

      • 作为参考,$.ajax 上的 dataType 选项告诉 jQuery 期望的响应类型,而不是要提交的请求类型
      【解决方案3】:

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

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

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

      【讨论】:

      • 我希望您删除任何 json_decode 或您可能拥有的任何内容。实际上,我告诉您添加方括号是不正确的,jQuery 会为您执行此操作 - 但是,您不需要在服务器端进行任何处理。只需var_dump($_POST),您就会看到您正在寻找的数据。我刚刚也用 jQuery 测试了这个。
      【解决方案4】:

      尝试记录您收到的数据并查看您收到了什么,我已经使用以下代码测试了您的 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));
       }
       });
      });
      

      【讨论】:

      • 对于您可以使用的完整数据,error_log(serialize($data)."\n",3,"log.txt");
      【解决方案5】:

      您不需要解码您的$_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 数据定义为get(在调用回调时拥有一个已经解码的对象)。

      【讨论】:

        【解决方案6】:

        您正在发送表单数据,所以它不会被 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-23
          • 2013-01-06
          • 2014-02-16
          • 2013-12-26
          • 2014-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多