0

我在寻求让 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,但与实际 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);}
4

2 回答 2

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

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

于 2013-02-25T20:48:49.110 回答
1

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

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

于 2013-02-25T19:50:20.390 回答