我有一个带有ajax调用的页面,我根据用户选择构建。在某些情况下,它按预期工作。在其他情况下,目标页面不会收到我传递的_POST项目。
以下是该页面的关键部分:
var filters = getFilters();
var fnargs = "GetArticles|" + filters ;
$.ajax({
url: 'retrievedata.php',
type: "POST",
async:true,
data: {"functionname":"getpapers", "arguments":fnargs},
dataType: "JSON",
success: function (obj) {
if( (obj.error != '') ) {
if (obj.length == 0) {
$("#message").text("No articles match your choices. Showing previous list of articles.");
}
else {
$("#message").empty();
ArticleTable = '';
for (line=0; line<obj.length; line++) {
ArticleTable += "<tr><td>";
ArticleTable += "<a href='" + obj[line].URL + "' target='_blank'>";
ArticleTable += obj[line].Title;
ArticleTable += "</a>";
ArticleTable += "</td>";
ArticleTable += "<td>" + obj[line].Publication + "</td>";
ArticleTable += "<td>" + obj[line].PubDate + "</td>";
ArticleTable += "<td>" + obj[line].ArticleType + "</td></tr>";
}
//console.log(ArticleTable);
$("#articles tbody").html(ArticleTable);
$("#articles").trigger("update",true);
}
}
else {
$("#testresult").text("Error");
}
success = true;
},
error: function(textStatus, errorThrown) {
success = false;
$("#testresult").text('Error occurred: '.textStatus);
}
})
retrieveata.php就像这样开始(当然我添加了var_dump用于调试):
$aResult = array();
$returnval = 'at start';
var_dump($_POST);
if( !isset($_POST['functionname']) ) {
$aResult['error'] = 'No function name!';
$returnval = 'No function name!';
}
if( !isset($_POST['arguments']) ) {
$aResult['error'] = 'No function arguments!';
$returnval = 'No function arguments!';
}
(dbfns.php是一组与SQL Server通信的函数,与问题无关。)
getFilters返回一个逗号分隔的字符串,其中包含3个较短的字符串。它可能是这样的:
'1','3,6','2015'
或者它可以是3个空字符串:
'','',''
或某些可能是空的,其他人填充:
'1','',''
无论我传递什么值,Firefox Web控制台的“网络”选项卡都会显示已组装正确的参数。例如,对于最后一种情况,我在Params选项卡中看到了这一点:
functionname:"getpapers"
arguments:"GetArticles|'1','',''"
但来自retrieveata页面的回复是这样的:
array(0) {
}
No function arguments!
也就是说,它没有收到_POST数据。但这并不总是发生。例如,如果getFilters返回此字符串:
'','','1999'
然后网络标签显示我:
functionname:"getpapers"
arguments:"GetArticles|'','','1999'"
和retrieveata给了我这个回复(以及页面要检索的实际数据):
array(2) {
["functionname"]=>
string(9) "getpapers"
["arguments"]=>
string(24) "GetArticles|'','','1999'"
}
我不明白为什么getFilters返回的值的差异会产生这种影响。
编辑:用户@Davis让我检查,结果发现,在不起作用的情况下,我的POST正在变为GET。任何想法为什么会发生?答案 0 :(得分:0)
实际上,您发布JSON
作为请求的正文而不是帖子变量。
以下是检索已发布的JSON
var_dump(file_get_contents('php://input'));
这只是字符串,在解析之前需要解码
$data = file_get_contents('php://input');
$json = json_decode($data);