使用 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.stringify
或json_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 服务器?