我有PHP循环。我从记录中获取id, lat, lon数据,将其传递给脚本进行一些计算,然后将此数据传递给AJAX,这将保存MySQL DB中计算的结果,如果成功,则将添加确认文本行到结果div。
我的代码(我确实修改了它以保持对问题的关注)
<div id="distance_results"></div>
<?php
$result = $mysqli->query("SELECT * FROM test")
while($row = $result->fetch_array()) {
$id = $row['id'];
$city = $row['city'];
$lat = $row['lat'];
$lon = $row['lon'];
$driving_from = "51.528308,-0.3817765";
$driving_to = "$lat,$lon";
?>
<script>
var id = '<?php echo $id ?>';
var city = '<?php echo $city ?>';
var start = '<?php echo $driving_from ?>';
var end = '<?php echo $driving_to ?>';
// code
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
// code
var mi = response.routes[0].legs[0].distance.value;
console.log(id);
console.log(city);
console.log(mi);
//Ajax Begin
$.ajax({
type: 'post',
url: 'test-dc-upd.php',
data: {'updateid': id, 'distance': mi},
success: function() {
html="Distance between London and " + city + " is " + mi;
$("#distance_results").append("<p>"+html+"</p>");
}
});
//Ajax End
} else {}
});
</script>
<?php } ?>
AND CODE FOR "test-dc-up .php"
$id = $_POST['updateid'];
$distance = $_POST['distance'];
$result = $mysqli->query("UPDATE test SET distance='$distance' WHERE id='$id' LIMIT 1");
PHP循环遍历MySQL DB但是当我看到console:
根据纬度/经度计算'mi'值;
问题:
1)'id'和'city'的值保持不变(循环中最后一条记录的值);
2) AJAX只更新循环中最后一条记录的值
所以很明显,这个循环有一些问题。
有什么建议我做错了吗?修改这个$("<p>"+ html +"</p>").append("#distance_results");
$("#distance_results").append("<p>"+ html +"</p>");
你的jquery代码是错误的。首先,你必须把选择器和附加函数的html代码。
Nita,将success函数改为:
success: function() {
html="Distance between CITYX and " + city + " is " + mi;
$("<p>"+ html +"</p>").append("#distance_results");
}
});
success: function() {
html="Distance between CITYX and " + city + " is " + mi;
$("#distance_results").append(<p>"+ html +"</p>);
// this will append the dynamic content to #distance_results
}
});
解释:
要放一个动态内容是一些html对象,你必须首先准备然后选择HTML对象并将内容放入其中。
在一个循环调用ajax请求不是一个好的做法,我们可以很容易地传递数组值javascript使用函数内爆像这样
这个内爆函数适用于一维数组,
var ar = <?php echo '["' . implode('", "', $ar) . '"]' ?>;
对于您的问题,您需要为结果创建一个多维数组,如下所示…
<?php
$result = $mysqli->query("SELECT * FROM test");
$arr= array();
while($row = $result->fetch_array()) {
$arr[]=array('id'=>$row['id'],'city'=>$row['city],'lat'=>$row['lat']...etc);
}
?>
之后,你可以像这样将数组中的每一项传递给javascript
var idArray= <?php echo '["' . implode(', ', array_column($arr, 'id')); . '"]' ?>;
var cityArray= <?php echo '["' . implode(', ', array_column($arr, 'city')); . '"]' ?>;
你可以在javascript中获得每个标签作为数组,然后使用singajax请求将所有javascript数组传递给PHP脚本。并在服务器端操作。
你的ajax请求是这样的
$.ajax({
type: 'post',
url: 'test-dc-upd.php',
data: {
'idArray':idArray,
'cityArray':cityArray, //etc you need pass all array like this
},
success: function(data) {
// your success code goes here
}
});
注意array_column()函数只支持php 5.3或以上版本
我设法做到这一点不同的方式,我希望(但距离和旅行时间已计算超过3000个地点)。
所以我所做的是确保mysql (test-dc.php)找到距离和旅行时间没有计算的记录,进行计算,用Ajax更新记录。Ajax再次打开(test-dc.php),循环遍历所有结果,直到没有其他需要计算的结果为止。必须刷新几次,但没关系,任务完成。
Mysql查询的调整:
$result = $mysqli->query("SELECT * FROM test WHERE distance='' LIMIT 1")
和AJAX:
success: function() {
html="Distance between London and " + city + " is " + mi;
$("#distance_results").append("<p>"+html+"</p>");
location.href = "test-dc.php"
}
这样就成功了,但我仍然相信有更好的方法可以达到同样的结果,如果有人能帮我想出办法,我会很高兴的。