You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Google Maps API v3拖拽标记的经纬度保存到MySQL数据库?

解决方案

一、前端修改:捕获经纬度并发送到后端

修改你的initMap函数,在标记拖拽结束时,既更新页面显示,又通过AJAX将经纬度发送到后端接口;也可以存入隐藏表单,支持用户手动提交(可选)。

修改后的JS代码:

function initMap() {
  var map = new google.maps.Map(document.getElementById('map_canvas'), {
    zoom: 7,
    center: new google.maps.LatLng(52.215594, 21.014130),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  var myMarker = new google.maps.Marker({
    position: new google.maps.LatLng(52.215594, 21.014130),
    draggable: true
  });

  // 拖拽结束事件:更新显示+提交数据
  google.maps.event.addListener(myMarker, 'dragend', function(evt) {
    var lat = evt.latLng.lat().toFixed(6);
    var lng = evt.latLng.lng().toFixed(6);
    
    // 更新页面显示
    document.getElementById('current').innerHTML = `<p>Marker dropped: Current Lat: ${lat} Current Lng: ${lng}</p>`;
    
    // 方式1:AJAX自动提交到后端
    fetch('save_coords.php', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: `lat=${lat}&lng=${lng}`
    })
    .then(response => response.text())
    .then(data => {
      console.log('保存结果:', data);
      // 可添加成功提示,比如更新页面元素
    })
    .catch(error => {
      console.error('保存失败:', error);
    });

    // 方式2:存入隐藏表单,供用户手动提交(可选)
    document.getElementById('hidden_lat').value = lat;
    document.getElementById('hidden_lng').value = lng;
  });

  google.maps.event.addListener(myMarker, 'dragstart', function(evt) {
    document.getElementById('current').innerHTML = '<p>Moving marker...</p>';
  });

  map.setCenter(myMarker.position);
  myMarker.setMap(map);
}

若使用手动提交方式,需在页面添加表单:

<form action="save_coords.php" method="post">
  <input type="hidden" id="hidden_lat" name="lat">
  <input type="hidden" id="hidden_lng" name="lng">
  <button type="submit">保存坐标</button>
</form>

二、后端处理(结合Smarty框架)

创建save_coords.php脚本,负责接收前端参数、验证并写入MySQL数据库。

1. 核心逻辑代码

<?php
// 引入Smarty类文件(根据项目实际路径调整)
require_once('libs/Smarty.class.php');
$smarty = new Smarty();

// 数据库配置(替换为你的实际信息)
$db_host = 'localhost';
$db_user = 'your_db_user';
$db_pass = 'your_db_password';
$db_name = 'your_db_name';

// 建立数据库连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
  die("数据库连接失败: " . $conn->connect_error);
}

// 接收并验证前端参数
$lat = isset($_POST['lat']) ? trim($_POST['lat']) : '';
$lng = isset($_POST['lng']) ? trim($_POST['lng']) : '';

// 简单校验经纬度合法性
if (is_numeric($lat) && is_numeric($lng) && $lat >= -90 && $lat <= 90 && $lng >= -180 && $lng <= 180) {
  // 插入数据库(假设表名为map_coords,包含id、lat、lng、created_at字段)
  $stmt = $conn->prepare("INSERT INTO map_coords (lat, lng, created_at) VALUES (?, ?, NOW())");
  $stmt->bind_param("dd", $lat, $lng); // "dd"表示两个double类型参数

  if ($stmt->execute()) {
    echo "坐标保存成功,ID: " . $stmt->insert_id;
    // 若需用Smarty渲染结果页面,可替换为以下代码
    // $smarty->assign('success_msg', "坐标保存成功,ID: {$stmt->insert_id}");
    // $smarty->display('result.tpl');
  } else {
    echo "保存失败: " . $stmt->error;
  }

  $stmt->close();
} else {
  echo "无效的经纬度参数";
}

$conn->close();
?>

2. Smarty模板集成(可选)

若需在页面展示保存结果,创建result.tpl模板:

<!DOCTYPE html>
<html>
<head>
  <title>保存结果</title>
</head>
<body>
  {if isset($success_msg)}
    <div class="success">{$success_msg}</div>
  {elseif isset($error_msg)}
    <div class="error">{$error_msg}</div>
  {/if}
  <a href="map_page.php">返回地图页面</a>
</body>
</html>

三、关键注意事项

  • 安全防护:使用预处理语句避免SQL注入,同时校验经纬度的数值范围,防止非法输入。
  • 数据库表结构:确保已创建对应的数据表,示例SQL:
CREATE TABLE map_coords (
  id INT AUTO_INCREMENT PRIMARY KEY,
  lat DOUBLE NOT NULL,
  lng DOUBLE NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
  • 跨域问题:确保前端页面与后端接口在同一域名下,若跨域需配置CORS规则。

内容的提问来源于stack exchange,提问作者MiP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:37:26