将数组元素从javascript传递到php

时间:2018-04-25 12:52:31

标签: javascript php ajax

我正在尝试从数组的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);
?>

我有什么问题吗?

3 个答案:

答案 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();
        }