Jacek Francuz
Jacek Francuz

Reputation: 2498

Get a user's current location

How can I determine a user's current location based on IP address (I guess it works this way).

Upvotes: 47

Views: 229821

Answers (7)

Adnan Rasheed
Adnan Rasheed

Reputation: 876

<?php
    $query = @unserialize (file_get_contents('http://ip-api.com/php/'));
    if ($query && $query['status'] == 'success') {
        echo 'Hey user from ' . $query['country'] . ', ' . $query['city'] . '!';
    }
    foreach ($query as $data) {
        echo $data . "<br>";
    }
?>

Try this code using this source. *It works!

Upvotes: 19

lalithkumar
lalithkumar

Reputation: 3530

The old freegeoip API is now deprecated and will be discontinued on 2018-07-01.

The new API is from ipstack. You have to create the account in ipstack. Then you can use the access key in the API URL.

$url = "http://api.ipstack.com/122.167.180.20?access_key=ACCESS_KEY&format=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
$city  = $response->city; // You can get all the details like longitude, latitude from the '$response'.

For more information, check at freegeoip (GitHub).

Upvotes: 0

Sam Pettersson
Sam Pettersson

Reputation: 3217

An IP address gives you a quite unreliable location. You could Ajax the location upon load with JavaScript if it isn't critical to have the location at first. (Also, the user needs to give you its permission to access it.)

HTML5 Geolocation

Upvotes: 1

Venkat Sai
Venkat Sai

Reputation: 21

As PHP relies on a server, the real-time location can’t be provided. Only a static location can be provided. It is better to avoid to rely on the JavaScript for a location rather than using PHP.

But there is a need to post the JavaScript data to PHP, so that it can easily be accessible to a program on the server.

Upvotes: 2

Naveen DA
Naveen DA

Reputation: 4380

Edited

Change freegeoip.net into ipinfo.io

<?php    

function get_client_ip()
{
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    } else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    } else if (isset($_SERVER['REMOTE_ADDR'])) {
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    } else {
        $ipaddress = 'UNKNOWN';
    }

    return $ipaddress;
}
$PublicIP = get_client_ip();
$json     = file_get_contents("http://ipinfo.io/$PublicIP/geo");
$json     = json_decode($json, true);
$country  = $json['country'];
$region   = $json['region'];
$city     = $json['city'];
?>

Upvotes: 36

Hamza
Hamza

Reputation: 811

<?php
$user_ip = getenv('REMOTE_ADDR');
$geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=$user_ip"));
$country = $geo["geoplugin_countryName"];
$city = $geo["geoplugin_city"];
?>

Upvotes: 42

Bedh
Bedh

Reputation: 101

Try this code using the hostip.info service:

$country=file_get_contents('http://api.hostip.info/get_html.php?ip=');
echo $country;

// Reformat the data returned (Keep only country and country abbr.)
$only_country=explode (" ", $country);

echo "Country : ".$only_country[1]." ".substr($only_country[2],0,4);

Upvotes: 10

Related Questions