如何获取AJAX发送的JSON以使用PHP

时间:2013-02-25 19:44:21

标签: php jquery ajax json post

我试图让这个JSON可以被PHP使用,我在路障之后遇到了障碍,所以我想知道是否有人可以帮助我。

我将JSON存储在变量divisionsJSON:

    var divisionsJSON = JSON.stringify(divisions);  


然后我尝试使用.ajax发布以下内容:

$.ajax({
     url: "divisions.php",
     type: "post",
     data: divisionsJSON,
     success: function(){
     alert("success");
       $("#result").html('submitted successfully');
     },
     error:function(){
      alert("failure");
      $("#result").html('there is error while submit');
     }   
     }); 

(我从SO上的另一个问题复制了这个,但我的html中没有任何内容,id =“result” - 我想我可以删除那部分[删除已确认])

然后,我的divisions.php页面包含以下内容:

<?php 
    $url = "divisions.php";
    $json = file_get_contents($url);
    $json = utf8_encode($json);
    $elements = json_decode($json);
    var_dump($elements);
  ?>

我对PHP / ajax的经验不足以及我对让它工作的挫败感让我尝试了很多不同的东西。到目前为止,当我加载divisions.php时,我要么得到NULL,要么没有。我的直觉告诉我,这是ajax的一个问题,但我对PHP缺乏经验,我不能自信地说我的PHP足够正确,我应该得到回报。我已经尝试了var_dump,print_r,echo,绝对没有任何东西出现在与实际PHP / JSON相关的divisions.php上。任何和所有的帮助将不胜感激!

使用更新的代码回复:

我在没有utf8行的情况下使用以下php获取NULL,在utf8行中添加时使用string(0)“”:

<?php
        $json = json_decode(file_get_contents('php://input'));
        $elements = utf8_encode($json);
        var_dump($elements);
?>

有什么想法吗?

编辑完整的php页面:

<!DOCTYPE html>

<html lang="en">

<head>  
    <meta charset="utf-8">
    <title>untitled</title>
    <link rel="stylesheet" href="styles/reset.css" />
</head>

<body>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="underscore.js"></script>
<script type="text/javascript" src="application.js"></script>
<script type="text/javascript" src="divisions.js"></script>
<?php
        print_r($_POST);
?>
</body>
</html>

我已经为php,print_r($ _ POST);, json_decode($ _ POST);等尝试了多行,但我根据我在其他SO和此页面上看到的内容改变了很多东西我真的发呆了。

编辑:这个代码,我打算制作一个数组,不会产生JSON吗?因为它似乎不像我在使用JSON atm。

var divisions = [];
for (var i = 0; i < arr.length; i++) {
    if(arr[i].value != "N/A"){
    var obj = { "login": arr[i].login,
            "value": "http://www.value.net/index/" + arr[i].value};
    divisions.push(obj);}

2 个答案:

答案 0 :(得分:2)

首先,在处理JSON时,最好的方法是尽可能地让它独自存在。想想它是否是脆弱的商品。你做的任何事都可以打破它。

考虑到这一点,不要使用stringify(),事实上你不需要因为JQuery会检测它并为你处理它(因为它们知道它很脆弱)。

其次,选项数据:在$ ajax()方法中需要给出一个对象。一般来说,你会做这样的事情,

data: {mydata:divisionsJSON}

这样你就可以通过

访问后端的JSON
$json = json_decode($_POST['mydata']); 

或者,根据您设置分区数组的方式,您可以将其作为对象数据发布:正在寻找并通过$ _POST ['divisions_key'] = divisions_value在PHP中访问它;但这会导致以后出现各种各样的问题,并且将前端和后端硬连接起来非常糟糕(大多数情况下,例外情况如下)。

此外,如果您期望JSON响应,则需要使用dataType:'JSON'选项在原始调用中指定,以便JQuery可以正确处理它。

$.ajax({
 url: "divisions.php",
 type: "post",
 data: {mydata:divisions},
 success: function(response){
   $("#result").html(response.message);
 },
 error:function(response){
  $("#result").html(response.message);
 }   
 });

但是,在我们走得太远之前,JS中的分区变量令人不安。来自哪里?这是一种形式吗?如果是这样,你可以使用serialize()这样

var divisions = $('#myform').serialize();

这将创建key =&gt;值对,其中键是表单字段的名称,值(显然)是字段的值。您可以像平常一样访问PHP中的值。

在考虑有关阵列结构的早期问题时,这是将数据作为对象发布的可接受情况。如果它是一个表单,那么表单结构将根据需要链接到后端,因此在data:选项中直接使用该对象就可以了。这就是整个第一个“不管它”的概念。这里的最后一个案例完全抛弃了这个对象;从它离开DOM到处理程序收到它的时间,它是100%的时间对象。

答案 1 :(得分:1)

正如@slamborne在评论中提到的,正确的电话是json_decode(file_get_contents('php://input'))

你的调用实际上是在调用divisions.php,这就是为什么你要返回NULL(它没有任何数据可以返回给你,因为divisions.php没有输出任何东西)