Como obter a localização de ipinfo.io em PHP?

estou a usar ipinfo.io para obter a minha cidade actual (localização) usando o PHP.

No entanto, não consigo ver a minha cidade ao usar este código.

$ipaddress = $_SERVER["REMOTE_ADDR"];

function ip_details($ip) {
    $json = file_get_contents("http://ipinfo.io/{$ip}/geo");
    $details = json_decode($json);
    return $details;
}

$details = ip_details($ipaddress);
echo $details->city;
Não sei onde está o erro.

Author: halfer, 2015-01-18

2 answers

function getClientIP(){
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
    $ip = $_SERVER['REMOTE_ADDR'];
  }
  return $ip;
}

$ipaddress = getClientIP();

function ip_details($ip) {
  $json = file_get_contents("http://ipinfo.io/{$ip}/geo");
  $details = json_decode($json, true);
  return $details;
}

$details = ip_details($ipaddress);
echo $details['city'];
Isto deve funcionar.

No entanto, recomendo que se habitue a usar o curl em vez do ficheiro_get_contents(), se quiser um recurso 'online'. https://stackoverflow.com/a/5522668/3160141

 6
Author: Octal, 2017-05-23 12:34:15
Estás a trabalhar no localhost? Tente o seguinte código:
$ipaddress = $_SERVER["REMOTE_ADDR"];

function ip_details($ip) {
    $json = file_get_contents("http://ipinfo.io/{$ip}/geo");
    $details = json_decode($json); // HERE!!!
    return $details;
}

$details = ip_details($ipaddress);
echo $details->ip; // CHANGE TO IP!!!

Se ele retorna seu IP, tudo está OK, seu IP é provavelmente 127.0.0.1, e este site não sabe a localização, então $details->city não está definido. Você deve verificar if (isset($details->city)) e fazer um script alternativo se a cidade não está lá.


Vejo que ainda tens problemas. Tente fazer algo assim:
$string = file_get_contents('http://ipinfo.io/8.8.8.8/geo');
var_dump($string);
$ipaddress = $_SERVER["REMOTE_ADDR"];
var_dump($ipaddress); 
$string2 = file_get_contents('http://ipinfo.io/'.$ipaddress.'/geo');
var_dump($string2);

E escreva em comentários que um falhou;).


Se apenas a parte IP estiver OK, tente ler isto um: o ficheiro _contents não está a funcionar?

E também executar este código com o máximo de comunicação de erros:

error_reporting(-1);

Antes desta parte do Código.

 2
Author: Jacek Kowalewski, 2017-05-23 12:02:14