使用 AJAX 将 lat/long 插入 SESSION 变量不起作用

Posted

技术标签:

【中文标题】使用 AJAX 将 lat/long 插入 SESSION 变量不起作用【英文标题】:Using AJAX to insert lat/long into SESSION variables not working 【发布时间】:2014-10-17 16:06:13 【问题描述】:

我有一个带有企业目录的网站,其中包含城市链接,用户可以点击这些链接并找到该城市附近的企业。

到目前为止,我只是在链接上使用 GET 变量并使用 php 和 Google Maps API 处理位置来完成此操作。不幸的是,该站点开始每天生成超过 2500 个查询,因此我决定尝试使用 javascript API 在用户单击链接时检索 lat/lng 客户端,然后使用 AJAX 将其设置为 SESSION。我以为我走在正确的轨道上,但它不起作用。它似乎根本不起作用,或者只是在多次单击链接后才更改 SESSION 变量。我以为设置async:false 会解决它,但它没有

有什么想法吗?

这是我的测试页面:

<?php
session_start();
require_once('../includes/header.php');

echo $_SESSION["address"] . "<br>";
echo $_SESSION["lat"] . "<br>";
echo $_SESSION["lng"] . "<br>";
?>

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>

<a href="test.php" id="Orlando" class="loc">Orlando</a><br /><br />
<a href="test.php" id="Tampa" class="loc">Tampa</a><br /><br />
<a href="test.php" id="Daytona" class="loc">Daytona</a><br /><br />


<script type="text/javascript">
function setLoc(lat,lng,address)
    $.ajax(
        async: false,
        type: 'POST',
        url: 'setLoc.php',
        data: lat: lat,lng: lng,address: address
        );


$('.loc').each(function() 
    $(this).click(function() 
        var address = $(this).attr('id');
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode(  'address': address+'FL', function(results, status) 
        var location = results[0].geometry.location;
        lat=location.lat();
        lng=location.lng();
        setLoc(lat,lng,address);
        );
    );
);

</script>

<?php 
require_once('../includes/footer.php');
?>

这是 setLoc.php 文件:

<?php
session_start();
unset($_SESSION["address"]);
unset($_SESSION["lat"]);
unset($_SESSION["lng"]);
$_SESSION["lat"] = $_POST["lat"];
$_SESSION["lng"] = $_POST["lng"];
$_SESSION["address"] = $_POST["address"]

?>

我添加了未设置,因为我认为每次清除它都会有所作为,但它没有

【问题讨论】:

首先,永远不要将 async 设置为 false,这里有龙。请记住,AJAX 是异步的,因此在 AJAX 完成之前不会设置 SESSION 变量。你可能想使用.when() unsets 似乎没有必要。 感谢您指出正确的方向,我最终使用preventDefault()success: 函数来完成我需要的工作。 【参考方案1】:

我能够使用这个实现我想要的结果:

<script type="text/javascript">
function setLoc(lat,lng,address,href)
    $.ajax(
        type: 'POST',
        url: 'setLoc.php',
        data: lat: lat,lng: lng,address: address,
        success: function()
            location.href=href;
        
        );


$('.loc').each(function() 
    $(this).click(function(e) 
        var href=$(this).attr('href');
        e.preventDefault();
        var address = $(this).attr('id');
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode(  'address': address+'FL', function(results, status) 
        var location = results[0].geometry.location;
        var lat=location.lat();
        var lng=location.lng();
        setLoc(lat,lng,address,href);
        );
    );
);
</script>

【讨论】:

以上是关于使用 AJAX 将 lat/long 插入 SESSION 变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 Lat/Long 转换为状态

TileProvider 方法 getTile - 需要将 x 和 y 转换为 lat/long

使用 R 将 lat/long 点的数据框空间连接到多边形 shapefil

Lat/Long 掩码正/负检测

C# 使用 lat/long 数组计算多个曲率

在 UIView(不是 MKMapView)中使用 lat/long 的最佳实践