Ir para conteúdo
Webster Moitinho

Localização errada no GeoIP

Recommended Posts

Estou tentando criar log de acessos em Banco de Dados com base em IP e Geolocalização. Para tanto estou usando um script disponibilizado por GeoIP-DB. Quando faço o teste local, dá tudo certo. Me dá a minha cidade, cep, latitude longitude... Porém, quando subo para a nuvem, ele mostra esses dados do servidor, e não os meus.

Meu código php está assim:

    date_default_timezone_set('America/Sao_Paulo'); 

    $json = file_get_contents('https://geoip-db.com/json');
    $data = json_decode($json);

    $cidade      = $data->city;
    $cep             = $data->postal;
    $lat             = $data->latitude;
    $long            = $data->longitude;

    $PDO = new PDO( 'mysql:host=' . HOST . ';dbname=' . DB, USER, PASS );
    $sql = "INSERT INTO `stat` (`id_stat`, `cidade`, `cep`, `latitude`, `longitude`) VALUES (NULL, $cidade, $cep, $lat, $long)";
    $compile    = $PDO->prepare($sql);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Webster Moitinho O problema é bem simples!

 

Quando você utiliza o file_get_contents para fazer uma requisição para o site do Geoip, quem faz essa requisição é o seu servidor é não o usuário, por isso ele retorna os dados do seu servidor.

 

O Geoip trabalha com base no Ip para pegar a localização, quando você utiliza o link "https://geoip-db.com/jsonp", ele vai pegar o ip de quem fez a requisição para ele como foi o server quem fez a requisição ele vai pegar a localização do server.

 

Você pode pegar o IP do usuário usando o $_SERVER['REMOTE_ADDR'] e passar ele junto do link do Geoip, assim o Geoip vai usar o IP que você passou para ele acha a localização.

 

Exemplo:

$json = file_get_contents('https://geoip-db.com/json/'.$_SERVER['REMOTE_ADDR']);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por FerdzFernando
      Por que ele está trazendo localização EUA no emulador android studio? É possível fazer essa correção ?
    • Por juliomarques75
      Olá pessoal, estou aqui para pedir ajuda, mas não para me dar mastigado nada, mas alguém que possa me mostrar o caminho das pedras para minha duvida.
      Seguinte, como faço para o site abrir determinada área ou pagina, de acordo onde ele esta acessando?
      Exemplo, se estou na cidade "B" ele abre determinada pagina, e se vou para a cidade "F" ele abre outra pagina, falo assim pq cada pagina vai possuir uma determinada consulta ao banco de dados e realizar a pesquisa em uma tabela especifica para aquela região.
      Se alguém puder me ajudar e me orientar pra que lado seguir agradeço muito...
       
      Abraço a todos!
    • Por oomaikoo
      Boa noite pessoal, estou tentando fazer um código, para mostrar um banner em meu site, quando o usuário entrar, baseado na localização dele. É basicamente o seguinte: a API de geolocalização retorna o nome da cidade, e, se for a cidade, então mostre o banner. Se não for, mostre outro. O código JavaScript que estou usando é esse:
      <script type="application/javascript"> function geoip(json){ var city = document.getElementById("user_city"); city.textContent = json.city; } </script> <script async src="https://get.geojs.io/v1/ip/geo.js"></script> A cidade é: <span id="user_city"></span>

      Esse código retorna o nome da cidade no <span id>.

      Porém eu preciso fazer um IF, ELSE no próprio JavaScript, para mostrar o banner ou não. Seria basicamente assim:
      <script type="application/javascript"> function geoip(json){ var city = document.getElementById("user_city"); city.textContent = json.city; } if (city == "nomedacidade") { document.write ("<img src='banner1.jpg'></img>"); } else { document.write ("<img src='banner2.jpg'></img>"); } </script> <script async src="https://get.geojs.io/v1/ip/geo.js"></script>

      O problema é que a variável city não fica setada dentro do if, não retorna o nome da cidade, eu só queria comparar no if o nome da cidade com o que a API retorna.
      Alguém tem alguma ideia?
    • Por mpcarvalho
      Pessoal, seguinte. Eu sei somente o basicão de JS, peguei um script para obter a localização do usuário que acessar a minha página, estou testando algumas funções inicialmente para realizar outras aplicações futuras, dado que nunca utilizei essa função antes.
       
      Dúvida 1 = Quero melhorar a precisão dos dados que irei receber do usuário, para isso já pesquisei e encontrei a seguinte função: 
       
      {enableHighAccuracy:true, maximumAge:30000, timeout:27000}
       
      Onde posso utiliza-la no meu código abaixo?
       
      <script>
          window.onload = getLocation;
          
      function getLocation() {
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(showPosition);  
        } else {
            location.href="https://google.com";
        }
      }
      function showPosition(position) {
           var latitude = position.coords.latitude; 
          var longitude =  position.coords.longitude;
          var accuracy = position.coords.accuracy;
          $.ajax({
              method: "post",
              url: "page.php",
               data: {'latitude': latitude, 'longitude': longitude, 'accuracy': accuracy},
               success: function(data){
                   location.href="https://google.com";
               }
             });
          }
      </script>
       
      Dúvida 2 = Quando o usuário rejeitar o fornecimento de sua localização, como posso redireciona-lo par ama URL mesmo assim, sendo que na forma acima não funcionou.
    • Por Sulivan de Deus
      Olá pessoal, estou pensando em usar a geolocalização, surgindo um pop-up, caso o usuário permita o site saber sua localização e algumas condicionais, por exemplo caso o internauta esteja perto da loja física.

      Por exemplo:

      Se o usuário permitiu a localização e estiver pelo menos a 5km da loja física, echo na mensagem x.

      Eu achei alguns códigos que me deram um caminho, mas não foi o suficiente para construir a idea já que não tenho conhecimento vasto em javascript, segue abaixo os códigos que encontrei.

      No meu caso não gostaria que mostrasse o mapa, apenas calculasse a rota para saber qual a distância do usuário até a loja física e enviássemos um pop-up falando quantos km ou metros ele esta da loja, e um link para ele ser levado para rota no google maps.
       
      <!DOCTYPE html> <html> <body> <script type="text/javascript"> window.onload=function(){ getLocation(); }; </script> <div id="mapholder"></div> <script src="http://maps.google.com/maps/api/js?sensor=false"></script> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else{x.innerHTML="Geolocalização não é suportada nesse browser.";} } function showPosition(position) { lat=position.coords.latitude; lon=position.coords.longitude; latlon=new google.maps.LatLng(lat, lon) mapholder=document.getElementById('mapholder') mapholder.style.height='250px'; mapholder.style.width='500px'; var myOptions={ center:latlon,zoom:14, mapTypeId:google.maps.MapTypeId.ROADMAP, mapTypeControl:false, navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL} }; var map=new google.maps.Map(document.getElementById("mapholder"),myOptions); var marker=new google.maps.Marker({position:latlon,map:map,title:"Você está Aqui!"}); } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="Usuário rejeitou a solicitação de Geolocalização." break; case error.POSITION_UNAVAILABLE: x.innerHTML="Localização indisponível." break; case error.TIMEOUT: x.innerHTML="O tempo da requisição expirou." break; case error.UNKNOWN_ERROR: x.innerHTML="Algum erro desconhecido aconteceu." break; } } </script> </body> </html>
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.