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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вам просто нужно закодировать свои переменные в 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,3740234375</td></tr><tr><td>1 551854433</td><td>-6,6027488708496 </td><td>53.374073028564</td></tr></tbody></table>
Неустранимая ошибка 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
Я думаю, что уже пытался поместить его в try/catch, может быть, его просто нужно объявить.
Поместите оператор if в свой цикл и не создавайте еще один цикл.
Здесь есть два шага:
В первом случае вы можете воспользоваться преимуществами цикла, который у вас уже есть, если производительность является проблемой (тысячи временных рамок), но для более чистого кода я бы предложил объявить специальную функцию в вашем 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». Это должен быть полный код?
<tbody><tr ><td>1551849760</td><td>-6,602801322937</td><td>53,3740234375</td></tr><tr><td>1 551854433</td> <td>-6,6027488708496</td><td>53,374073028564</td></tr></tbody><
p.s. Я предполагаю, что это должно быть "$result = $document;"? а не "$ результат = документ;"?
Извините, я пишу на JS каждый день и накосячил, когда писал этот кусок PHP. Я починил это. Я вижу, вы нашли другой ответ, хотя ;-)
Это то, что вы ищете?
var my_var = <?php echo json_encode($my_var); ?>;