使用 ajax 将 JSON 发送到 PHP

Posted

技术标签:

【中文标题】使用 ajax 将 JSON 发送到 PHP【英文标题】:Sending JSON to PHP using ajax 【发布时间】: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", 【参考方案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"));

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

【讨论】:

以上是关于使用 ajax 将 JSON 发送到 PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fetch API 将数据发送到 PHP 服务器(首选 POST 方法和 JSON)

如何使用 AJAX 将 JSON 数据发送到 ASP 服务器?

我在使用 ajax 将 json 数据发送到控制器时遇到问题

使用 Ajax 将图像发送到 PHP

使用 Ajax 将数组发送到 PHP 脚本

如何使用 Ajax 将图像发送到 PHP 文件?