javascript - 使用 PHP 和 javascript 从数据库插入标记和信息窗口(Google map )

标签 javascript php mysql google-maps

我的目标是从数据库中的表中获取数据并将其显示在 map 上。我的表有三列:LATITUD(存储纬度)(type = float(10,6)),LONGITUD(存储经度)(type = float 10,6)和ASUNTO(存储信息)(type = VARCHAR)。前两列包含标记位置的信息,而第三列存储与标记相关的信息。最后一栏的内容是我想通过信息窗口显示的内容。

为了在页面的主体元素内实现此目的,我决定插入一个脚本元素(javascript),我用它来创建 map 并加载与其相关的所有信息。

在这段 JavaScript 代码中,我包含了 PHP 代码,该代码负责对数据库进行查询,以获取我们在开头提到的关联数组中的表的内容。在这段代码中,通过 while 循环,我想加载所有标记及其相应的信息窗口。

加载标记没有给我带来任何问题,为了加载它们,我使用了这个 while 循环代码。

while ($row = $resultado->fetch( PDO::FETCH_ASSOC )) {
              echo '  var myLatlng1 = new google.maps.LatLng('.
              $row['LATITUD'].', '.$row['LONGITUD'].'); 
              var marker1 = new google.maps.Marker({ 
              position: myLatlng1, 
              map: map, 
              });';
 }

在 PHP 脚本中我插入了这段代码并且对我来说工作得很好。当我想为每个标记添加信息窗口时遇到问题,其中包含开头提到的“ASUNTO”列中存储的信息。当我修改上面显示的代码以添加信息窗口时,我遇到了问题。给我带来问题的代码是下面的代码。

while ($row = $resultado->fetch( PDO::FETCH_ASSOC )) {
              echo ' var asunto = '. $row['ASUNTO'] . ';';
              echo '  var myLatlng1 = new google.maps.LatLng('.
              $row['LATITUD'].', '.$row['LONGITUD'].'); 
              var marker1 = new google.maps.Marker({ 
              position: myLatlng1, 
              map: map, 
              });



              var infowindow = new google.maps.InfoWindow({
                content: asunto
              });


              infowindow.open(map, marker1);


              ';
        }

我认为给我带来问题的代码行是循环内的第一个代码行,我现在将在下面显示。

echo ' var asunto = '. $row['ASUNTO'] . ';';

我之所以相信这一点,是因为当我将“infowindow”变量的内容更改为不是通过 PHP 获取并直接插入的字符串时,它不会给我带来任何问题,并且在调用它时会显示一个信息窗口使用“打开”方法。下面的下一个代码不会给我带来任何问题。

while ($row = $resultado->fetch( PDO::FETCH_ASSOC )) {

              echo '  var myLatlng1 = new google.maps.LatLng('.
              $row['LATITUD'].', '.$row['LONGITUD'].'); 
              var marker1 = new google.maps.Marker({ 
              position: myLatlng1, 
              map: map, 
              });



              var infowindow = new google.maps.InfoWindow({
                content: "hello"
              });


              infowindow.open(map, marker1);


              ';
        }

正如您所看到的,信息窗口的内容已更改,当我更改它时,它工作正常并且 map 能够加载。我想显示信息窗口,它显示数据库中存储的信息,而不是上面示例中的字符串“hello”。

我想知道为什么我的方法失败以及如何解决问题,以便能够显示我想要的每个标记的信息窗口。

最佳答案

问题不在于数据库,也不在于 php。问题在于您在哪里回显该数据。

一个简单的例子,很明显这是行不通的

while ($row = $resultado->fetch( PDO::FETCH_ASSOC )) {
  echo '  var myLatlng1 = new google.maps.LatLng('.
  ...

while 循环创建此代码的多个实例。变量 myLatlng1 将被简单地覆盖。

您需要做的是将数据与函数分开。

所以你生成了 1 个变量。

应该是这样的(我的 php 有点生疏,我希望我没有生成错误):

<?php
$data = array();  // we make an empty object/array, we will fill it with the data in the rows
while ($row = $resultado->fetch( PDO::FETCH_ASSOC )) {
  $data[] = array(
    'LATITUD'   => $row['LATITUD'],
    'LONGITUD'  => $row['LONGITUD'],
    'ASUNTO' => $row['ASUNTO'],
  );
}
// now we echo this variable, 1 variable containing all the data
$data_string = json_encode($data);  // this turns php arrays into a javascript-readable object
echo 'var my_data = ' . $data_string .';';  // notice which ; is for javascript and which is for php
?>

var my_data 将是这样的(我将插入布鲁塞尔的一些位置):

var my_data = [{"LATITUD":"50.89496405015655","LONGITUD":"4.341537103056892","ASUNTO":"Atomium"},{"LATITUD":"50.84501941894387","LONGITUD":"4.349947169423087","ASUNTO":"Manneken Pis"},{"LATITUD":"50.83847065124941","LONGITUD":"4.376028969883903","ASUNTO":"European Parliament"}];
<小时/>

现在是 JavaScript。您如何使用信息窗口?我将使用 my_data 硬编码,因此您可以复制/粘贴此代码并测试 JavaScript。

不要忘记您的 API key

<style>
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
  #map {
    height: 90%;
  }
</style>
<div id="map"></div>
<script>
  var my_data = [{"LATITUD":"50.89496405015655","LONGITUD":"4.341537103056892","ASUNTO":"Atomium"},{"LATITUD":"50.84501941894387","LONGITUD":"4.349947169423087","ASUNTO":"Manneken Pis"},{"LATITUD":"50.83847065124941","LONGITUD":"4.376028969883903","ASUNTO":"European Parliament"}];

  var map;
  function initMap() {
    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: 50.869754630095834, lng: 4.353812903165801},
      zoom: 12
    });
    for(var i=0; i<my_data.length; i++) {
      // marker
      var position = {lat: Number(my_data[i].LATITUD), lng: Number(my_data[i].LONGITUD)};
      var marker = new google.maps.Marker({
        position: position,
        title: my_data[i].ASUNTO,
        map: map
      });

      // infowindow
      var infowindow = new google.maps.InfoWindow({
        content: my_data[i].ASUNTO,
        map: map,
        position: position
      });
    }
  }
</script>
<script src="https://maps.googleapis.com/maps/api/js?callback=initMap" async defer></script>

关于javascript - 使用 PHP 和 javascript 从数据库插入标记和信息窗口(Google map ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39108006/

相关文章:

javascript - 如何复制GMail的拖放标签功能?

php - 根据mysql字段设置选择的选项

java - Wildfly 10 在启动时无法加载 MySQL XA 驱动程序

php - php 中的 json_encode

php - 服务器端集群谷歌地图标记

javascript - 使用 jQuery 解析自定义 XML 模式

javascript - 尝试获取 process.env node.js 时出现 SyntaxError : Unexpected token .

javascript - 为什么第四个嵌套值的访问速度比第五个慢?

php - 不存储在数据库 PHP/MYSQL 中的禁用字段

php - Wordpress meta_query LIKE 比较数组中的值