#javascript #php #ajax #loops
#javascript #php #ajax #циклы
Вопрос:
У меня есть цикл PHP. Я беру данные id, lat, lon из записи, передаю их в скрипт для выполнения некоторых вычислений, затем я передал эти данные в AJAX, который сохранит результаты этого вычисления в базе данных MySQL, если оно будет успешным, тогда оно добавит строку текста подтверждения в раздел результатов.
Мой код (я обрезал его, чтобы сосредоточиться на проблеме)
<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 } ?>
И КОД ДЛЯ «test-dc-upd.php «
$id = $_POST['updateid'];
$distance = $_POST['distance'];
$result = $mysqli->query("UPDATE test SET distance='$distance' WHERE id='$id' LIMIT 1");
Итак, PHP выполняет цикл через MySQL DB, когда, но когда я смотрю на консоль:
значения ‘mi’ хорошо вычисляются в соответствии с lat / lon;
ПРОБЛЕМЫ:
1) значения ‘id’ и ‘city’ остаются неизменными (значения последней записи в цикле);
2) AJAX обновляет значение только последней записи в цикле
Итак, очевидно, что есть какая-то проблема с циклом.
Любое предложение о том, что я делаю не так?
Комментарии:
1. Измените $(«<p>» html «</p>»).append(«#distance_results»); на $(«#distance_results»).append(«<P>» html «</p>»);
2. сейчас отображается прогресс ok, но самая большая проблема все еще существует (значения переменных те же, и ajax обновляет эти записи)
Ответ №1:
Измените это $("<p>" html "</p>").append("#distance_results");
на
$("#distance_results").append("<p>" html "</p>");
Ваш код jquery неверен. Сначала вы должны поместить селектор и в функцию добавления HTML-кода.
Ответ №2:
Нита, измените функцию успеха с:
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 и поместить в него содержимое.
Ответ №3:
В цикле, вызывающем ajax-запрос, не является хорошей практикой, мы можем легко передать массив значений в javascript, используя функцию implode следующим образом
эта функция implode предназначена для одномерного массива,
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);
}
?>
afetr, что вы можете передать каждый элемент в массиве в javascript следующим образом
var idArray= <?php echo '["' . implode(', ', array_column($arr, 'id')); . '"]' ?>;
var cityArray= <?php echo '["' . implode(', ', array_column($arr, 'city')); . '"]' ?>;
вы можете получить каждый тег в виде массива в javascript, после чего с помощью запроса sing ajax передать весь массив 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 или выше
Комментарии:
1. хм, это кажется более профессиональным, но мне нужно сначала рассчитать расстояние, а затем отправить его в AJAX?? Я обновил свой вопрос содержанием «test-dc-upd.php «. Потому что этот файл тоже придется изменить…
2. итак, мой вопрос будет здесь, как мне поместить результаты вычисления расстояния в массив, а затем как мне удалить это значение в Mysql для каждого идентификатора?
3. в вашем коде вы находите расстояние с помощью этой функции, верно? DirectionsService.route(запрос, функция (ответ, статус), тогда откуда поступает запрос параметров?? @Nita
4. Спасибо за вашу помощь, я нашел soultion, отличный от вашего, но у меня есть один вопрос о вашем soultion? что произойдет, если у меня будет 3000 пользователей? или даже лучше, что произойдет, если у меня будет 36000 записей?
5. с моей точки зрения, я намерен думать так, это своего рода путь к решению, если у вас есть большое количество записей, тогда вам нужно обработать данные, сохранить их в виде массива и передать на сервер через ajax. на вашем пути количество запросов ajax велико, это не очень хорошая практика
Ответ №4:
Мне удается сделать это немного по-другому, на что я надеялся (но расстояние и время в пути были рассчитаны для более чем 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"
}
Итак, это сделало свое дело, но я все еще верю, что есть лучший способ добиться того же результата, я буду рад, если кто-нибудь поможет мне разобраться в этом.