Заполните переменные JavaScript значениями PHP

Эта страница map.php отображает таблицу, содержащую документы mongoDB, которые содержат время, широту и долготу для чтения координат.

Он также использует API Google для отображения местоположения на карте (аппаратно). Я хочу заменить широту/долготу, читаемую скриптом карты Google, широтой/долготой записи таблицы с наибольшим значением «Время» (также известной как последняя запись). Я понимаю, что вы можете написать операторы эха php прямо, чтобы получить значения, но, как вы можете видеть, у меня есть цикл для получения записей таблицы, реально ли сделать то, что я хочу здесь? Изучающий PHP, абсолютный новичок в mongodb и javascript здесь. Спасибо за любую помощь!

Обновлено: РЕШЕНО, отредактировано до рабочего решения в соответствии с выбранным ответом. Спасибо всем.

   <!DOCTYPE html>
<html>
  <head>
    <style>
       /* Set the size of the div element that contains the map */
      #map {
        height: 400px;  /* The height is 400 pixels */
        width: 100%;  /* The width is the width of the web page */
       }
    </style>
  </head>
  <body>
    <h3>Last Locations</h3>

    <?php
    //name of DB: muntean Name of collection:TestData
    $user = "muntean";
    require '/var/composer/vendor/autoload.php';
    $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    $collection = new MongoDB\Collection($manager, $user, 'testData');

    $data  = "<table style='border:1px solid red;";
    $data .= "border-collapse:collapse' border='1px'>";
    $data .= "<thead>";
    $data .= "<tr>";
    $data .= "<th>Time</th>";
    $data .= "<th>Longitude</th>";
    $data .= "<th>Latitude</th>";
    $data .= "</tr>";
    $data .= "</thead>";
    $data .= "<tbody>";

   try{
    $cursor = $collection->find();
    $largest =  0;
   foreach($cursor as $document){
   if ($largest < $document["Time"]) {
       $largest = $document["Time"];
       $longitude = $document["Longitude"];
       $latitude = $document["Latitude"];
   }

   $data .= "<tr>";
   $data .= "<td>" . $document["Time"] . "</td>";
   $data .= "<td>" . $document["Longitude"]."</td>";
   $data .= "<td>" . $document["Latitude"]."</td>";
   $data .= "</tr>";
  }
  $data .= "</tbody>";
  $data .= "</table>";
  echo $data;
  }catch(MongoException $mongoException){
    print $mongoException;
    exit;
}


     ?>

    <!--The div element for the map -->
    <div id = "map"></div>
    <script>
// Initialize and add the map
function initMap() {
  // The location of point
   var point = {lat: <?php echo $latitude; ?>, lng: <?php echo $longitude; ?>}
  // The map, centered at point
  var map = new google.maps.Map(
      document.getElementById('map'), {zoom: 12, center: point});
  // The marker, positioned at point
  var marker = new google.maps.Marker({position: point, map: map});
}
    </script>
    <!--Load the API from the specified URL
    * The async attribute allows the browser to render the page while the API loads
    * The key parameter will contain your own API key (which is not needed for this tutorial)
    * The callback parameter executes the initMap() function
    -->
    <script async defer
    src = "https://maps.googleapis.com/maps/api/js?key=AIzaSyD6CMFIF-m8Z_kNLUGT7HEVBew_wPLno7o&callback=initMap">
    </script>

  </body>
</html>

Места рандомныеЗаполните переменные JavaScript значениями PHP

Это то, что вы ищете? var my_var = <?php echo json_encode($my_var); ?>;

samb102 06.03.2019 10:07

Это формат (кодировка json не всегда необходима, насколько я понимаю?), но нет конкретного 'my_var' для таргетинга, который я вижу. Например, если я хочу изолировать долготу, будет ли это "var longitude = <?php echo json_encode($document["Longitude"]; ?>; ? На самом деле это не может быть полностью правильным, поскольку это изменится и написано для Находка().

Jay.F 06.03.2019 10:12

Я так думаю (с закрывающей скобкой)

samb102 06.03.2019 10:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
254
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вам просто нужно закодировать свои переменные в Json в PHP, чтобы получить строку с JS. затем вы декодируете Json, и ваши переменные будут в красивом объекте JS.

<script>
let json= "<?php echo json_encode($variables); ?>";
let obj = JSON.parse(json);
</script>
Ответ принят как подходящий

В цикле PHP вы можете сохранить долготу и широту с наибольшим значением времени, например:

$largest =  0;
foreach($cursor as $document){
   if ($largest < $document["Time"]) {
       $largest = $document["Time"];
       $longitude = $document["Longitude"];
       $latitude = $document["Latitude"];
   }

   $data .= "<tr>";
   $data .= "<td>" . $document["Time"] . "</td>";
   $data .= "<td>" . $document["Longitude"]."</td>";
   $data .= "<td>" . $document["Latitude"]."</td>";
   data .= "</tr>";
}

После того, как вы можете повторить $longitude и $latitude в свой javascript

var point = {lat: <?php echo $latitude; ?>, lng: <?php echo $longitude; ?>}

><td>1551849760</td><td>-6,602801322937</td><td>53,374023437‌​5</td></tr><tr><td>1 551854433</td><td>-6,6027488708496 </td><td>53.374073028564</‌​td></tr></tbody></table>

Jay.F 06.03.2019 12:11

Неустранимая ошибка PHP: необработанное исключение «MongoDB\Driver\Exception\LogicExceptio n» с сообщением «Курсоры не могут создавать несколько итераторов» в /home/muntean/www/m ap.php:52 Трассировка стека: #0 /home/muntean/www /map.php(52): unknown() #1 {main} добавлено в /home/muntean/www/map.php в строке 52

Jay.F 06.03.2019 12:11

Я думаю, что уже пытался поместить его в try/catch, может быть, его просто нужно объявить.

Jay.F 06.03.2019 12:12

Поместите оператор if в свой цикл и не создавайте еще один цикл.

R3tep 06.03.2019 12:42

Здесь есть два шага:

  • Получить документ с последними данными
  • Вставьте значения в свой JS

В первом случае вы можете воспользоваться преимуществами цикла, который у вас уже есть, если производительность является проблемой (тысячи временных рамок), но для более чистого кода я бы предложил объявить специальную функцию в вашем PHP:

/**
 * Returns the latest data in a collection, or false if none exists
 */
function getLatestData($collection) {
  $cursor = $collection->find();
  $result = null;
  foreach ($cursor as $document) {
    // If it's the first iteration or if this doc is newer
    if ($result === null || $document['Time'] > $result['Time']) {
      $result = $document;
    }
  }
  if ($result !== null) {
    return ['lat' => $result['Latitude'], 'lng' => $result['Longitude']];
  }
  return false;
}

Затем внутри вашего JS вы можете использовать json_encode для преобразования результата в строку JSON:

var point = <?=json_encode(getLatestData($collection))?>;

Спасибо. var point = <?=json_encode(getLatestData($ collection))?>; читается как «var point = true». Это должен быть полный код?

Jay.F 06.03.2019 12:22

<tbody><tr ><td>1551849760</td><td>-6,602801322937</td><td>53,374023437‌​5</td></tr><tr><td>1 551854433</td> <td>-6,6027488708496</td><td>53,374073028564</‌​td></tr></tbody><

Jay.F 06.03.2019 12:24

p.s. Я предполагаю, что это должно быть "$result = $document;"? а не "$ результат = документ;"?

Jay.F 06.03.2019 12:34

Извините, я пишу на JS каждый день и накосячил, когда писал этот кусок PHP. Я починил это. Я вижу, вы нашли другой ответ, хотя ;-)

blex 06.03.2019 17:03

Другие вопросы по теме