2

我的 php 脚本中有一个 json_encode,如果在 while 循环中调用 json_encode,它似乎会使 Jquery 方面失败。

当我在浏览器窗口而不是页面中查看结果时,我需要结果,我可以看到它确实有效。

例如:

while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data = array("id" => $id,
    "title" => $title,
    "success" => true
    );
echo json_encode($data); // Inside the While Loop

}

浏览器中的输出是:

{"id":"15","title":"Advanced Booking Examples","success":true}
{"id":"14","title":"Advanced Booking Fields","success":true}
{"id":"11","title":"Add New Driver","success":true}
{"id":"10","title":"Registering a Driver \/ Add New Vehicle","success":true}
{"id":"8","title":"Dispatch Controls","success":true}
{"id":"7","title":"Troubleshooting Driver Device Checklist","success":true}
{"id":"6","title":"Requirements Checklist","success":true}

在 jQuery 响应中,这实际上是空白的,但是如果我将其留在echo json_encode($data);while 循环之外,则 jQuery 会获取响应,但是只有 1 条记录 - 是循环中的最后一条记录。

我需要 jQuery 从循环中获取所有结果。

这是JS

$.ajax({ // Send it off for prcessing
        type: "POST",
        dataType: 'json',
        url: "includes/auto_suggest.php",
        data: {
            q: inputString
        },
        success: function (result) {
            if (result.success) {             
                var id = result.id;
                var title = result.title;                    
                $('#auto_id').append("<input type='text' class='hideid' id='hideid_" + id + "' value='" + id + "'/>");              
        $('#auto_title').prepend("<p>" + title + "</p>");
            }
        }
    });

有任何想法吗?

提前致谢

4

8 回答 8

8

JSON 需要全部位于一个数组或对象上。您需要将每一行附加到一个数组,然后json_encode

$data = array();
while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data[] = array(
      "id" => $id,
      "title" => $title,
      "success" => true
    );
}
echo json_encode($data);

然后在 JavaScript 中,您将拥有一个可以循环访问的对象数组。

$.ajax({ // Send it off for prcessing
    type: "POST",
    dataType: 'json',
    url: "includes/auto_suggest.php",
    data: {
        q: inputString
    },
    success: function (result) {
        $.each(result, function(){
          if (this.success) {
            var id = this.id;
            var title = this.title;
            $('#auto_id').append("<input type='text' class='hideid' id='hideid_" + id + "' value='" + id + "'/>");
            $('#auto_title').prepend("<p>" + title + "</p>");
         }
        });
    }
});
于 2012-06-07T18:32:30.580 回答
3

好吧,您没有发送有效的 JSON。将对象存储在一个数组中,然后json_encode在循环后存储该数组。

$data = array();
while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data[] = array("id" => $id,
        "title" => $title,
        "success" => true
    );
}
echo json_encode($data);

然后,您需要更改 JavaScript 代码以正确处理数组而不是对象。由于这里没有人知道您到底打算做什么,因此您必须自己做或提供更多信息。

于 2012-06-07T18:32:18.183 回答
2

您需要将结果数据添加到数组并调用json_encode一次,如下所示:

$data = array();
while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data[] = array("id" => $id,
    "title" => $title,
    "success" => true
    );
}

echo json_encode($data);

这将更改您输出的 JSON(因为当前您的 JSON 无效),您现在必须在 jQuery 回调中循环。

于 2012-06-07T18:32:54.863 回答
2

当该行在循环内时返回的 JSON 作为一个整体无效。它是多个 JSON 字符串在一起。你需要把它们分开。

我会创建一个数组并在循环内将每个添加$data到该数组中。然后,在循环之外,json_encode它并回显它。这将创建一个 JSON 字符串以返回到您的 javascript。

于 2012-06-07T18:33:10.100 回答
1

也许...

$data = array();
while( WHATEVER ){
    // other code
    $data[] = array('id' => $id, 'title' => $title, 'success' => true);
}

echo json_encode($data);

将所有信息存储在一个数组中,然后对该数组进行编码。

于 2012-06-07T18:32:34.187 回答
1

您不能将这样的多个对象传递给 jQuery。当 while 循环完成时,放入 in 数组并打印对象数组。

于 2012-06-07T18:32:44.720 回答
1

您需要在 while 循环之外对 json 进行编码。它将返回单个 json,这实际上是正确的

while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data[] = array("id" => $id,
    "title" => $title,
    "success" => true
    );


}
echo json_encode($data); 
于 2012-06-07T18:32:52.350 回答
1

您的 JSON 输出无效。试试这个完整的代码(编辑):

$result = Array();
while ($row = mysql_fetch_array($result)) {     
    $id = $row['id'];
    $title = $row['title'];
    $content = $row['content'];

    $data = array("id" => $id,
        "title" => $title,
    );
    $result[] = $data;
}
echo json_encode(Array('data'=>$result,'success'=>true)); // Outside the While Loop

在你的 javascript 代码中

$.ajax({ // Send it off for prcessing
        type: "POST",
        dataType: 'json',
        url: "includes/auto_suggest.php",
        data: {
            q: inputString
        },
        success: function (results) {
            if (results.success) {
                for(var i in results.data) {
                    var result = results.data[i];             
                    var id = result.id;
                    var title = result.title;                    
                    var $newfield = $("<input type='text' class='hideid' id='hideid_" + id + "' value='" + id + "'/>");              
                    $newfield.prepend("<p>" + title + "</p>");
                    $('#auto_title').append($newfield);
                }
            }
        }
    });
于 2012-06-07T18:35:56.830 回答