我很困惑。
我将一个键值对象从jquery传递给了php。并成功再次提醒它,但如果我去php页面。它说数据是null或未定义的索引。
下面的是我的jquery
$('#test').click(function(){
var obj= {
'key': 'value',
};
$.ajax({
url: "../folder/file.php",
type: "POST",
data: {
'obj' : obj
},
dataType: "JSON",
success:function(data){
alert(data);
}
});
});
下面是我的php
$data = $_POST['obj']; // this is line 1
echo json_encode($data); // this is line 2
使用上面的代码,当我点击测试按钮时,我会收到警告value
。但如果我在浏览测试按钮后进入php页面。该页面显示Notice: Undefined index: obj on line 1, and null on line 2.
为什么?
我收到了我所投入的价值的警报。因此,它必须意味着数据经过并返回。但是php页面说它是空的。
答案 0 :(得分:2)
$_POST['myobj'];
是一个数组,而不是一个json字符串。
虽然在ajax方法中将它用作data
的值时它是一个JS对象,但除非您明确设置contentType
,否则它将被转换为post数据。默认情况下,内容类型为application/x-www-form-urlencoded; charset=UTF-8
因为您使用的是默认内容类型:
例如, $_POST['myobj']['key1']
应该是key1的值。
在对象上使用var_dump
可以更好地查看它,并了解它的结构。
即
var_dump($_POST['myobj']);
答案 1 :(得分:0)
我认为当您将JSON对象发布到PHP时,您可以通过php://input阅读它们。 php://input
包含原始POST数据,因此是需要进行JSON编码的字符串:
// Read all
$json = file_get_contents('php://input');
// String -> array (note that removing `true` will make it object)
$obj = json_decode($json, true);
// Print it
var_dump($obj);
小型演示(test.php)
<?php
var_dump($_POST);
// Read all
$json = file_get_contents('php://input');
// String -> array (note that removing `true` will make it object)
$obj = json_decode($json, true);
// Print it
var_dump($obj);
?>
使用curl
输出来调用它:
$ curl -X POST -d '{"test": "value"}' localhost/test.php
array(0) {
}
array(1) {
["test"]=>
string(5) "value"
}
最后,如果您希望能够同时传递JSON数据和URL参数,请使用以下命令:
function buildRequest(){
// Get Data
$json = file_get_contents('php://input');
// Form the request from the imput
if ($json!=""){
$_REQUEST = array_merge_recursive($_REQUEST,json_decode($json, true));
}
}
buildRequest();
var_dump($_REQUEST);
使用URL和数据参数调用上述内容会导致:
curl -X POST -d '{"test": "value"}' localhost/test.php?param=value2
array(2) {
["param"]=>
string(6) "value2"
["test"]=>
string(5) "value"
}
如果以上情况适合您,请告诉我。