【问题标题】:POST, AJAX, and PHP : JSON submissionPOST、AJAX 和 PHP:JSON 提交
【发布时间】:2011-10-23 05:25:32
【问题描述】:

好的,这是我的 JS/jQuery 代码,我的 rate.php 文件中只有一个 print_r($_POST)。问题是,$_POST 接受rated 作为字符串"Array",而不是我定义的实际数组。如何更正此代码,以便 PHP 将 JSON 输入识别为正确的数组,而不是字符串?

var rated = {"key" : key , "value" : value};

$.ajax({
  type: "POST",
  url: $(location).attr('protocol') + "//" + $(location).attr('hostname') + "/ajax/rate.php",
  data: {
    "rated" : rated
  },
  success: function(data) {
    alert(data);
  }
});

这是我得到的输出消息:

数组 ( [额定] => 数组 )
致命错误.../ajax/rate.phpX
中只能通过引用传递变量


编辑:rated 实际上还有更多变量,但它们都不是数组(因此它们没有问题),所以为了简洁起见,我将它们从上面的代码中删除。

【问题讨论】:

    标签: php javascript jquery ajax json


    【解决方案1】:

    当通过 ajax 将 JSON 数据传递给您的 php 脚本时,我建议对 JSON 数据进行字符串编码,然后在服务器端对其进行解析。

    var rated = {"key" : key , "value" : value};
    var rated_encoded = JSON.stringify(rated);
    
    $.ajax({
      type: "POST",
      url: $(location).attr('protocol') + "//" + $(location).attr('hostname') +     "/ajax/rate.php",
      data: {
        "rated" : rated_encoded
      },
      success: function(data) {
        alert(data);
      }
    });
    

    然后您应该能够使用 $_POST 访问 PHP 脚本中的 POST 变量,就像使用任何其他标量值一样。在服务器端获得 JSON 字符串“rating_encoded”后,使用 PHP 的 json_decode() 将其解析为关联数组。

    if(isset($_POST["rated"])){
        $rated_json = $_POST["rated"];
        $JSONArray  = json_decode($rated_json, true); //returns null if not decoded
        //Values can now be accessed like standard PHP array
        if($JSONArray !== null){ 
            $key = $JSONArray["key"];
            $value = $JSONArray["value"];
        }
    }    
    

    我发现这种方法对于将 javascript 对象数据传输到服务器非常有效,反之亦然(使用 PHP 的 json_encode() 将 PHP 数组转换为有效的 javascript 对象)

    【讨论】:

      【解决方案2】:

      这是一个合适的数组,只是不是你期望的那样。只需将rated 按原样传递给data 参数即可实现您可能想要的。即

      var rated = {"key" : key , "value" : value};
      
      $.ajax({
        type: "POST",
        url: $(location).attr('protocol') + "//" + $(location).attr('hostname') + "/ajax/rate.php",
        data: rated,
        success: function(data) {
          alert(data);
        }
      });
      

      【讨论】:

      • 实际上有更多的变量进行了评级,但它们都不是数组(因此它们没有问题),所以为了简洁起见,我将它们从上面的代码中删除。
      • @Matt,那么您期望的请求数据是什么?因为不是你传递参数rated 和值{"key" : key, "value" : value} 并且HTTP 不支持参数嵌套。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2021-09-02
      • 1970-01-01
      • 2014-05-02
      • 2014-08-15
      • 2017-09-07
      相关资源
      最近更新 更多