我正在尝试从数组的javascript元素传递给php进行处理,如下所示:
for(var i=0;i<points.length;++i){
var xmlhttp = new XMLHttpRequest();
var distancesObject = null;
lat = points[i][LAT];
lng = points[i][LNG];
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
if(xmlhttp.response!=null){
distancesObject = JSON.parse(xmlhttp.response);
}
}
};
xmlhttp.open("GET", "Distances.php?lat=" + lat + "&lng=" + lng, true);
xmlhttp.send();
}
它应该迭代遍历数组的每个元素并返回该对象,如果它存在于数据库中,但它返回null,即使我确定第一个值存储在数据库中。 它只有在我传递点[0],点[1]等值时才有效。 php代码是:
<?php
$latitude = $_GET['lat']; //"47.158857";
$longitude = $_GET['lng']; // "27.601249"
$query = "SELECT pharmacyDistance, schoolDistance, restaurantDistance, busStationDistance FROM distances WHERE lat='$latitude' and lng='$longitude'";
$result = mysqli_query($dbc,$query);
$count = mysqli_num_rows($result);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$json_array = json_encode($row);
if($json_array!=null){
echo $json_array;
}
mysqli_close($dbc);
?>
我有什么问题吗?
答案 0 :(得分:2)
请不要这样做。真。将所有数组项添加到您的网址中,只执行一个请求,您将在其中查询所需的所有内容并返回列表。处理响应中的列表。像(从我的头顶)的东西:
var urlParams = [];
points.forEach(function(point) {
urlParams.push("lat[]=" + point.LAT + "&lng[]=" + point.LNG);
});
var xmlhttp = new XMLHttpRequest();
var distancesObject = null;
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
if(xmlhttp.response!=null){
distancesObject = JSON.parse(xmlhttp.response);
}
}
};
xmlhttp.open("GET", "Distances.php?" + urlParams.join("&"), true);
xmlhttp.send();
在PHP中:
$whereClause = "";
for ($i = 0; $i < count($_GET['lat']); $i++) {
$whereClause.= "(lat='" . $_GET['lat'][$i] . "' and lng='" . $_GET['lng'][$i]. "') and ";
}
$query = "SELECT pharmacyDistance, schoolDistance, restaurantDistance, busStationDistance FROM distances WHERE " . substr($whereClause, 0, (strlen($whereClause) - 4)); // Substr to remove last ' and' from where clause
$result = mysqli_query($dbc,$query);
$count = mysqli_num_rows($result);
$distances = array();
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$distances[] = $row;
}
$json_array = json_encode($distances);
if($json_array!=null){
echo $json_array;
}
mysqli_close($dbc);
然后你会得到一个distances
作为json的列表,只有一个命中数据库。此外,你的应用程序在for循环中调用ajax是不健康的,它会打开各种并行的异步请求,一团糟。
这是查询大致如下所示的方式:
SELECT ... FROM ... WHERE (lat='1' and lng='1') and (lat='2' and lng='2') and ...
我没有测试那些代码,我暂时没有使用PHP,所以我希望代码没问题,请原谅任何拼写错误或语法错误。
答案 1 :(得分:0)
我相信你的问题在于这两行:
lat = points[i][LAT];
lng = points[i][LNG];
首先,您已将它们定义为全局范围。除非您已经在上面定义了这些变量,否则它们应该以{{1}}关键字作为前缀。
其次,var
正在尝试使用名为LAT的(我假设单元)变量。使用字符串键名称的正确语法是[LAT]
或points[i]['LAT']
。
所以,将代码更新为
points[i].LAT
应该有希望解决你的问题。
答案 2 :(得分:0)
你正在覆盖在for循环中处理连接的对象,可能比响应可以返回的速度快。
尝试:
var xmlhttp = [];
for(var i=0;i<points.length;++i){
xmlhttp[i] = new XMLHttpRequest();
var distancesObject = null;
lat = points[i][LAT];
lng = points[i][LNG];
xmlhttp[i].onreadystatechange = function() {
if (xmlhttp[i].readyState == 4 && xmlhttp[i].status == 200){
if(xmlhttp[i].response!=null){
distancesObject = JSON.parse(xmlhttp.response);
}
}
};
xmlhttp[i].open("GET", "Distances.php?lat=" + lat + "&lng=" + lng, true);
xmlhttp[i].send();
}