我试图将JSON传递给AngularJS中的PHP脚本,如下所示:
var testObj = {
answers : {
aa : 2,
ab : 3
}
};
var userAnswers = angular.toJson(testObj.answers);
$http.post("ajax/testAddObject.php?answers=" + userAnswers).
success(function(data){
console.log("Result: ", data);
});
在PHP方面,我正在做以下事情:
//... new PDO connection to DB
$answers = $_POST['answers'];
//some more stuff
$answers
变量始终为空。但随后几乎随机,我看到了this question,答案说:
在标题中传递$_POST
时,
Content-Type: application/json
将为空
而且,虽然我的代码与问题中的代码不完全相同,但我在PHP代码上将$_POST[...]
更改为$_GET[...]
并且它有效! 问题是,为什么?彼此之间有什么区别?因为,从我看来,似乎没有太大的区别......
答案 0 :(得分:7)
$http.post("ajax/testAddObject.php?answers=" + userAnswers).
您要将answers
作为查询参数(GET)发送至testAddObject.php
而不发布(POST) - 请注意?
末尾的testAddObject.php
参数 -
$ _ GET数据作为URL中的参数传递。 $ _POST不是。
答案 1 :(得分:4)
$_POST
。
$_GET
会填充来自网址query string部分的数据。
$_GET
。它只关心它是否在查询字符串中。
因为它是在评论中提出来的。 $_REQUEST
包含来自$_POST
和的数据来自$_GET
和来自$_COOKIES
的数据。通常最好避免使用,因为它可能会让您对来自您不期望的地方的数据感到惊讶。
答案 2 :(得分:0)
我深入研究了这个问题,我发现this article解释说这是一个AngularJS"功能",实际上。
默认情况下,angular.js会在json中发送所有数据。因此,如果您对PHP代码发出
POST
请求,则不会填充$_POST
超全局。
虽然我的代码不完全正确,但如果我将客户端更改为:
$http.post("ajax/testAddObject.php?", {answers : userAnswers}) //...
并相应地更改PHP,$_POST[...]
仍然不返回任何内容,这现在有些意义。
根据同一篇文章,有两个解决方案,一个在客户端,另一个在服务器端
在服务器上,您可以解析输入,然后解码来自json的数据:
$data = file_get_contents("php://input"); $postData = json_decode($data);`
在客户端,数据可以以PHP期望的方式发送:
$http({ url:url data : $.param(data), method : 'POST', headers : {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'} }).success(callback);