【问题标题】:Sending JSON to PHP using ajax使用 ajax 将 JSON 发送到 PHP
【发布时间】:2012-06-12 21:03:15
【问题描述】:

我想向php发送一些json格式的数据,并在php中做一些操作。我的问题是我无法通过 ajax 将 json 数据发送到我的 php 文件。请帮助我该怎么做。这种方式我试过了。。

<script>
$(function (){
 $("#add-cart").click(function(){
    var bid=$('#bid').val();
    var myqty=new Array()
    var myprice=new Array()

    qty1=$('#qty10').val();
    qty2=$('#qty11').val();
    qty3=$('#qty12').val();

    price1=$('#price1').val();
    price2=$('#price2').val();
    price3=$('#price3').val();

    var postData = 
                {
                    "bid":bid,
                    "location1":"1","quantity1":qty1,"price1":price1,
                    "location2":"2","quantity2":qty2,"price2":price2,
                    "location3":"3","quantity3":qty3,"price3":price3
                }
    var dataString = JSON.stringify(postData);

    $.ajax({
            type: "POST",
            dataType: "json",
            url: "add_cart.php",
            data: {myData:dataString},
            contentType: "application/json; charset=utf-8",
            success: function(data){
                alert('Items added');
            },
            error: function(e){
                console.log(e.message);
            }
    });
});
});
</script>

在 PHP 中我使用:

if(isset($_POST['myData'])){
 $obj = json_decode($_POST['myData']);
 //some php operation
}

当在 php 文件中添加 print_r($_POST) 时,它会在 firebug 中显示 array(0) {}。

【问题讨论】:

  • 删除contentType: "application/json; charset=utf-8",

标签: php jquery ajax json


【解决方案1】:

丢失contentType: "application/json; charset=utf-8",。您不是在向服务器发送 JSON,而是在发送一个普通的 POST 查询(恰好包含一个 JSON 字符串)。

这应该会让你有工作。

问题是,您根本不需要在这里使用JSON.stringifyjson_decode。做吧:

data: {myData:postData},

然后在 PHP 中:

$obj = $_POST['myData'];

【讨论】:

  • 那么如果我将 json 发送到服务器呢?我如何收到它?为什么它与 MVC.NET 不同?
  • @Ayyash:如果您发送 JSON,则必须读取原始输入数据(来自 php://input)。我对 MVC.NET 一无所知,所以无法回答。
  • 或者可能是 IIS 与 Apache 的问题?我在两者中都使用了相同的 ajax 函数,但在 .NET 中我只是抓取 Request.Post,在 PHP 中不起作用,php://input 出于某种原因也没有,唯一起作用的是传递查询字符串属性和使用 $_REQUEST... 很痛
  • @Ayyash:使用查询字符串和$_POST 有什么问题?这就是 HTML 表单的提交方式。如果你真的想发送JSON,你可以尝试$HTTP_RAW_POST_DATA如果php://input不起作用。
  • 我想我明白了,“我想”,如果你没有将 content-type 设置为 json,那么在 MVC 中查看,你将不会是一个快乐的人发送回映射到模型的 json 对象,但也可以从请求中读取它...... PHP 中不是这种情况。另一方面,如果您确实选择使用 JSON contentType,则在 MVC 表单中需要 JSON.stringify 整个数据对象,但它不会在我的 PHP 表单中传递!
【解决方案2】:

这是因为$_POST 预先填充了表单数据。

要获取 JSON 数据(或任何原始输入),请使用 php://input

$json = json_decode(file_get_contents("php://input"));

【讨论】:

  • 如果我要这样做,我就不会使用 jQuery。另一方面,我将手动完成所有操作。
【解决方案3】:

使用 json 和 ajax 将 javascript obj 发送到 php:

js:

var dataPost = {
   "var": "foo"
};
var dataString = JSON.stringify(dataPost);

$.ajax({
   url: 'server.php',
   data: {myData: dataString},
   type: 'POST',
   success: function(response) {
      alert(response);
   }
});

在 php 中使用该对象:

$obj = json_decode($_POST["myData"]);

echo $obj->var;

【讨论】:

    【解决方案4】:

    如果您想通过 $_POST 变量获取值,则不应将 contentType 指定为 "application/json",而应使用默认的 "application/x-www-form-urlencoded; charset=UTF-8"

    JavaScript:

    var person = { name: "John" };
    
    $.ajax({
        //contentType: "application/json", // php://input
        contentType: "application/x-www-form-urlencoded; charset=UTF-8", // $_POST
        dataType : "json",
        method: "POST",
        url: "http://localhost/test/test.php",
        data: {data: person}
    })
    .done(function(data) {  
        console.log("test: ", data);
        $("#result").text(data.name);
    })
    .fail(function(data) {
        console.log("error: ", data);
    });
    

    PHP:

    <?php
    
    // $_POST
    
    $jsonString = $_POST['data'];
    
    $newJsonString = json_encode($jsonString);
    header('Content-Type: application/json');
    echo $newJsonString;
    

    如果您想将 JSON 从 JavaScript 发送到 PHP:

    JavaScript:

    var person = { name: "John" };
    
    $.ajax({
        contentType: "application/json", // php://input
        //contentType: "application/x-www-form-urlencoded; charset=UTF-8", // $_POST
        dataType : "json",
        method: "POST",
        url: "http://localhost/test/test.php",
        data: person
    })
    .done(function(data) {  
        console.log("test: ", data);
        $("#result").text(data.name);
    })
    .fail(function(data) {
        console.log("error: ", data);
    });
    

    PHP:

    <?php
    
    $jsonString = file_get_contents("php://input");
    $phpObject = json_decode($jsonString);
    
    $newJsonString = json_encode($phpObject);
    header('Content-Type: application/json');
    echo $newJsonString;
    

    【讨论】:

    • 我不是提问者,但它帮助了我很多:D
    • 这是最准确的答案
    【解决方案5】:

    我相信你可以试试这样的:

    var postData = 
                {
                    "bid":bid,
                    "location1":"1","quantity1":qty1,"price1":price1,
                    "location2":"2","quantity2":qty2,"price2":price2,
                    "location3":"3","quantity3":qty3,"price3":price3
                }
    $.ajax({
            type: "POST",
            dataType: "json",
            url: "add_cart.php",
            data: postData,
            success: function(data){
                alert('Items added');
            },
            error: function(e){
                console.log(e.message);
            }
    });
    

    json 编码应该会自动发生,并且您的帖子转储应该会给您如下信息:

    array(
        "bid"=>bid,
        "location1"=>"1",
        "quantity1"=>qty1,
        "price1"=>price1,
        "location2"=>"2",
        "quantity2"=>qty2,
        "price2"=>price2,
        "location3"=>"3",
        "quantity3"=>qty3,
        "price3"=>price3
    )
    

    【讨论】:

    • 失去contentType: "application/json; charset=utf-8",。您POST是一个标准查询字符串,而不是 JSON。然后print_r($_POST) 应该给你你显示的数组。
    【解决方案6】:

    只需删除:

    ...
    //dataType: "json",
    url: "index.php",
    data: {myData:postData},
    //contentType: "application/json; charset=utf-8",
    ...
    

    【讨论】:

    • 你应该保留dataType: "json",,这是服务器返回的数据类型。
    • 是的,确实如此,但必须返回 json 以避免另一个错误
    • 我假设 OP 正在返回 JSON,但只是没有显示出来。如果您什么都不返回,我认为不会有错误。如果您返回的不是 JSON,您只会收到错误。
    • 来自here "在 jQuery 1.4 中,JSON 数据以严格的方式解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。"这意味着用户 - 必须 - 调用 json_encode() 或得到一个错误,经过测试。
    【解决方案7】:

    您正在尝试以 js 对象格式发送 js 数组。

    代替使用

    var a = new array();
    a['something']=...
    

    尝试:

    var a = new Object();
    a.something = ...
    

    【讨论】:

      【解决方案8】:

      我知道已经有一段时间了,但以防万一有人仍然需要它:

      我需要传递的 JSON 对象:

      0:{CommunityId: 509, ListingKey: "20281", Type: 10, Name: "", District: "", Description: "",…}
      1:{CommunityId: 510, ListingKey: "20281", Type: 10, Name: "", District: "", Description: "",…}
      

      Ajax 代码:

      data: JSON.stringify(The-data-shows-above),
      type: 'POST',
      datatype: 'JSON',
      contentType: "application/json; charset=utf-8"
      

      还有 PHP 方面:

      json_decode(file_get_contents("php://input"));
      

      它对我有用,希望它可以帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多