我遇到了循环遍历从PHP传递给Ajax请求的数组的问题。
出于某种原因,我的javascript认为每个字符都是数组的一部分,或者我的响应变量只是作为字符串传递。
这是我的javascript:
<script>
$(function() {
$.ajax({
url: "/dev/editButton/get_names.php",
success: function(response) {
console.log(response);
}
});
});
</script>
这是我的PHP:
<?php
include '../portfolio/libraries/settings.php';
$connect = mysqli_connect($HOST, $DB_USER, $DB_PASS, $DATABASE);
$query = "SELECT * FROM AUTH_User";
$result = mysqli_query($connect, $query);
$names = array();
while ($row = mysqli_fetch_array($result)) {
array_push($names, $row['FirstName']." ".$row['LastName']);
}
echo json_encode($names);
?>
我得到的回应如下:
["Test Person","Test2 Person"]
但是,如果我使用javascript循环浏览或只打印出response[0]
,我会将每个字符作为数组的一部分。第一个元素是[
,其次是"
等。
我希望Test Person
成为一个元素而Test2 Person
成为另一个元素。
有人知道我做错了什么吗?谢谢!
答案 0 :(得分:3)
您需要在响应中使用JSON.parse。如果不调用该函数,您只需获取JavaScript字符串中的字符索引。
var resultArray = JSON.parse(response);
resultArray[0]; //Should Be "test Person"
答案 1 :(得分:2)
根据响应的.ajax
标头解释Content-Type
方法的结果。如果它不正确或未指定,response
变量将包含原始json代码作为字符串。
因此,一个解决方案是通过添加以下行来更改PHP代码:
header("Content-Type: text/json");
Docs:
默认情况下,预处理的类型取决于Content-Type 响应,但可以使用dataType选项显式设置。如果 提供了dataType选项,Content-Type标头 回应将被忽视。
您可以将该文本解析为对象,或者您可以通过在调用中指定数据类型让JQuery为您执行此操作。然后response
参数将保存对象而不是原始json字符串。
Docs:
如果指定了json,则使用jQuery.parseJSON解析响应 在作为对象传递给成功处理程序之前。解析了 JSON对象通过的responseJSON属性可用 jqXHR对象。
$(function() {
$.ajax({
url: "/dev/editButton/get_names.php",
datatype: "json",
success: function(response) {
console.log(response);
}
});
});
答案 2 :(得分:1)
在这种特殊情况下,您可以使用
success: function(response) {
response = eval(response);
console.log(response);
}
但这是不好的做法。
这里最好的解决方案是修改你的ajax调用,如下所示:
$(function() {
$.ajax({
url: "/dev/editButton/get_names.php",
datatype: 'json',
success: function(response) {
console.log(response);
}
});
});
指定的数据类型将请求返回的数据为json,jquery将自动将其解析为javascript对象。
答案 3 :(得分:0)
您必须将JSON解析为数组。您可以使用以下代码执行此操作:
var arr = $.parseJSON(response);
现在arr [0]应该是“测试人”。
答案 4 :(得分:0)
你可以用这种方式做到这一点,或者这样:
首先,您需要为AJAX指定返回类型。
$(function() {
$.ajax({
url: "/dev/editButton/get_names.php",
dataType: "json",
success: function(response) {
console.log(response);
}
});
});
或者,你可以这样做:
$(function() {
$.getJSON("/dev/editButton/get_names.php", function(response) {
console.log(response);
});
});
为此,您需要在PHP中相应地指定HTML标头:
<?php
include '../portfolio/libraries/settings.php';
$connect = mysqli_connect($HOST, $DB_USER, $DB_PASS, $DATABASE);
$query = "SELECT * FROM AUTH_User";
$result = mysqli_query($connect, $query);
$names = array();
while ($row = mysqli_fetch_array($result)) {
array_push($names, $row['FirstName']." ".$row['LastName']);
}
header("Content-Type: application/json");
echo json_encode($names);
exit();
?>
exit();
只是为了安全,所以你不会破坏有效的JSON格式。
JSON代表JavaScript Object Notation,因此您不必在那里做任何复杂的事情。这是一个简单的循环,例如:
for(var i in response) {
console.log(response[i]);
}
或者,如果响应不是数组而是具有属性的对象,则可以通过首先获取正确的键来遍历对象属性:
var objKeys = Object.keys(response);
for(var i in objKeys) {
var key = objKeys[i];
console.log(response[key]);
}
我希望这有帮助!