ajax调用:有时,_POST为空

时间:2017-03-20 15:58:13

标签: php jquery ajax post

我有一个带有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。任何想法为什么会发生?

1 个答案:

答案 0 :(得分:0)

实际上,您发布JSON作为请求的正文而不是帖子变量。

以下是检索已发布的JSON

的方法
var_dump(file_get_contents('php://input'));

这只是字符串,在解析之前需要解码

$data = file_get_contents('php://input');
$json = json_decode($data);