使用ajax调用我将json数据包发送到php后端,但json_decode
因为不明原因而失败。有问题的PHP代码在这里:
$request = file_get_contents('php://input');
Logger::getInstance()->debug("Request: ".$request);
// The logger shows the following line after a sample submission:
// Request: prospectname=OMEGAK&teaserimg=kb.png&submit=Submit
$data = json_decode($request, true);
Logger::getInstance()->debug("Data: ".var_export($data,true));
// The logger shows the following line after a sample submission:
// Data: NULL
json的包装来自各种类似的帖子,但我使用以下脚本(它只是试图发送表单提交的json编码的键值映射):
(function (){
$.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
$(function() {
$('form').submit(function() {
var $blah = $('form').serializeObject();
// The $blah object reads like so at this point:
// {"prospectname":"OMEGAKB","teaserimg":"kb.png"}
var promise = $.ajax({
url: 'myform/save',
dataType: 'json',
data: $blah,
type: 'POST'
});
promise.done(function (result) {
alert("Success: "+result);
});
promise.fail(function (result) {
alert("Failure: "+result);
});
return;
});
});
})();
任何人都可以解释我哪里出错,以及为什么php似乎转换或者收到错误的传入数据?
答案 0 :(得分:1)
是outlookname = OMEGAK& teaserimg = kb.png& submit =提交您所指的json?如果是这样,那不是json。这是一个网址字符串。 http://php.net/manual/en/function.urldecode.php
dataType: 'json'
不会将您的数据转换为json。它告诉服务器你试图发送json。
JSON
代表*javascript* object notation
。因此,当您使用jquery.serializeObject()时,实际上会获得一个对象作为回报。
直接来自php.net:
<?php
$query = "my=apples&are=green+and+red";
foreach (explode('&', $query) as $chunk) {
$param = explode("=", $chunk);
if ($param) {
printf("Value for parameter \"%s\" is \"%s\"<br/>\n", urldecode($param[0]), urldecode($param[1]));
}
}
?>
答案 1 :(得分:1)
你实际上并没有发送JSON。
您正在创建一个JavaScript对象并将其传递给$ .ajax,后者将其转换为查询字符串并发布它(它不会将其转换为JSON)。您可以使用JSON.stringify
将对象转换为JSON。
data: JSON.stringify($blah),
答案 2 :(得分:1)
不是100%肯定没有看到你的整个代码,但我相信,因为你最后在做“返回”而不是“return false”或“e.preventDefault()”,标准的提交按钮行为被触发,并且表单实际上是在没有ajax的情况下发布的。
答案 3 :(得分:1)
我的猜测是url
方法中的ajax
不是php页面。将其更改为path.php
以测试此理论。像处理关联数组一样处理PHP页面上的$data
,然后echo
或print
处理json_encode()
中要返回处理jQuery的结果,像:
echo json_encode($results);