Php 使用AJAX将lat/long插入会话变量不起作用

Php 使用AJAX将lat/long插入会话变量不起作用,php,jquery,ajax,google-maps,geolocation,Php,Jquery,Ajax,Google Maps,Geolocation,我有一个网站,有一个企业目录,其中有城市链接,用户可以点击并找到该城市附近的企业 到目前为止,我只需在链接上使用GET变量,并使用PHP和googlemapsapi处理位置,就可以完成这项工作。不幸的是,该站点开始每天生成2500多个查询,因此我决定尝试在用户单击链接时使用Javascript API检索lat/lng客户端,然后使用AJAX将其设置为会话。我以为我走对了路,但它不起作用。它似乎要么根本不起作用,要么只是在多次单击链接后才更改会话变量。我原以为设置async:false可以解决这

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

到目前为止,我只需在链接上使用GET变量,并使用PHP和googlemapsapi处理位置,就可以完成这项工作。不幸的是,该站点开始每天生成2500多个查询,因此我决定尝试在用户单击链接时使用Javascript API检索lat/lng客户端,然后使用AJAX将其设置为会话。我以为我走对了路,但它不起作用。它似乎要么根本不起作用,要么只是在多次单击链接后才更改会话变量。我原以为设置
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(lat、lng、地址){ $.ajax({ async:false, 键入:“POST”, url:'setLoc.php', 数据:{lat:lat,lng:lng,address:address} }); } $('.loc')。每个(函数(){ $(此)。单击(函数(){ var address=$(this.attr('id'); var geocoder=new google.maps.geocoder(); geocoder.geocode({'address':address+'FL'},函数(结果,状态){ var location=results[0]。geometry.location; lat=location.lat(); lng=location.lng(); setLoc(lat、lng、地址); }); }); });
这是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"]

?>


我添加了unsets,因为我认为每次清除它都会有所不同,但它没有

我能够使用以下方法实现我想要的结果:

<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>

函数setLoc(lat、lng、地址、href){
$.ajax({
键入:“POST”,
url:'setLoc.php',
数据:{lat:lat,lng:lng,address:address},
成功:函数(){
location.href=href;
}
});
}
$('.loc')。每个(函数(){
$(此)。单击(函数(e){
var href=$(this.attr('href');
e、 预防默认值();
var address=$(this.attr('id');
var geocoder=new google.maps.geocoder();
geocoder.geocode({'address':address+'FL'},函数(结果,状态){
var location=results[0]。geometry.location;
var lat=location.lat();
var lng=location.lng();
setLoc(lat、lng、地址、href);
});
});
});

首先,永远不要将async设置为false,这里有龙。请记住,AJAX是异步的,因此在完成AJAX之前不会设置会话变量。您可能想使用
取消设置
似乎没有必要。由于方向正确,我最终使用了
preventDefault()
success:
函数来执行我需要的操作。