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