我的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>");
}
}
});
有什么想法吗?
提前致谢
答案 0 :(得分:7)
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>");
}
});
}
});
答案 1 :(得分: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代码以正确处理数组而不是对象。由于此处没有人知道你打算做什么,你必须自己做或提供更多信息。
答案 2 :(得分: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回调中循环。
答案 3 :(得分:2)
当该行在循环内部时返回的JSON整体上无效。它是多个JSON字符串。你需要将它们分开。
我会创建一个数组并在循环内部将每个$data
添加到该数组中。然后,在循环之外,json_encode
它并回显它。这将创建一个JSON字符串以返回到您的javascript。
答案 4 :(得分:1)
...也许
$data = array();
while( WHATEVER ){
// other code
$data[] = array('id' => $id, 'title' => $title, 'success' => true);
}
echo json_encode($data);
将所有信息存储在一个数组中,然后对该数组进行编码。
答案 5 :(得分:1)
您无法将多个这样的对象传递给jQuery。放入数组并在while循环完成时打印对象数组。
答案 6 :(得分: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);
答案 7 :(得分: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);
}
}
}
});