PHP MySQL JS AJAX — проблема с циклом

#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"
}
  

Итак, это сделало свое дело, но я все еще верю, что есть лучший способ добиться того же результата, я буду рад, если кто-нибудь поможет мне разобраться в этом.