【问题标题】:How to get JSON sent by AJAX to work with PHP如何让 AJAX 发送的 JSON 与 PHP 一起工作
【发布时间】:2013-02-11 01:53:11
【问题描述】:

我在寻求让 PHP 可以使用这个 JSON 的过程中遇到了一个又一个的障碍,所以我想知道是否有人可以帮助我。

我将 JSON 存储在变量 partitionsJSON 中:

    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,但在 Divisions.php 上绝对没有显示与实际 PHP/JSON 相关的任何内容。任何和所有的帮助将不胜感激!

更新代码的响应:

我在没有 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);}

【问题讨论】:

  • 研究php://input,可以得到这样的json post数据:json_decode(file_get_contents('php://input'));
  • 我不会写php,但我很确定$json = file_get_contents($url);是错的。
  • 您正在发送或获取数据?
  • 在使用 php://input 进行编辑时做出响应,但对我仍然不起作用。

标签: php jquery ajax json post


【解决方案1】:

首先,在处理 JSON 时,最好的方法是尽可能不理会它。想想如果它是易碎品。你对它做的任何事情都可能破坏它。

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

二、选项数据:在$ajax()方法中需要给一个对象。通常你会做这样的事情,

data: {mydata:divisionsJSON}

这样您就可以通过

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

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

此外,如果您期望 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=>value 对,其中键是表单字段的名称,值是(显然)字段的值。您可以像往常一样访问 PHP 中的值。

在考虑前面关于数组结构的问题时,将数据作为对象发布是可接受的情况。如果它是一个表单,那么表单结构无论如何都会链接到后端,因此直接使用 data: 选项中的对象就可以了。这是“别管它”的第一个概念。这里的最后一种情况完全不考虑该对象。从它离开 DOM 到被处理程序接收到它的时间,它 100% 的时间都是一个对象。

【讨论】:

  • 'divisions' 是一个只包含对象的数组,每个对象包含两个键:值对。我删除了 json.stringify()。我尝试使用附加的dataType: 'JSON' 行将我的ajax 更新为您所拥有的。我的 PHP 现在看起来像这样:$json = json_decode($_POST['mydata']); print_r($_POST); Divisions.php 仍然返回 Array()。这一步要死我了。
  • 您可以尝试使用 console.log(divisions) 来确保部门中的数据是结构化的并且具有值吗?
  • console.log(divisions) 在 firebug 的 Divisions.php 命令行输入时返回一个包含所有对象的数组
  • 我不确定它是否会有所帮助,但我会将围绕 php 的其余 html 放入原始帖子中,以防万一我在那里搞砸了。
  • 在 IE 9 开发人员工具 (F12) 中也可以帮助跟踪标头请求以确保数据正在发布。如何做到这一点将是一个不同的问题,但这看起来很有希望。 msdn.microsoft.com/en-us/library/gg130952(v=vs.85).aspx
【解决方案2】:

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

您的调用实际上是对 Divisions.php 进行了另一次调用,这就是您返回 NULL 的原因(它没有任何数据可以返回给您,因为 Divisions.php 不输出任何内容) .

【讨论】:

  • 我执行了上述操作,然后尝试了print_r($_POST);,但是当 Divisions.php 页面加载时,我得到了一个空数组错误Array()
  • 现在尝试不使用 utf8 编码。它可能会导致您的问题。此外,您的 AJAX 调用是否在 divisions.php 文件中?如果是这样,请将它们分开。如果不使用函数,您的 PHP 代码将在访问该文件时运行,这可能是您在页面加载时收到错误的部分原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多