Is your website asking the customers to enter their country or any location-related data? if so, it is better to get it automatically by using a geolocation API.
I have used a popular geolocation API service to get the customers’ locations for my digital product shop.
It is always good to reduce the end-users effort in entering data. We should make them feel good by making the process seamless.
We will see how to get geolocation with country name and code using the IP address. It’s a two-step process where one step1 is to get the IP address and step 2 is to get the geolocation.
This example uses the IPWhoIs geolocation API tool to look up the location data by using the IP address.
This API endpoint looks for any IPV4, IPv6 or any domain as a parameter along with the geolocation request to read.
This code executes a 2-step process to output the location data.
It creates a PHP service with a function to get the user IP address from the $_SERVER array.
Then, it will use the IP address to set the cURL option to read the geolocation data.
This will output the country name, code and the given IP by parsing the API JSON response.
There are more uses for getting the geolocation of the users by the IP address.
The below file structure image shows the simplicity of this example with the minimal number of files.
The Request.php file has the prime functions that execute the two steps to get IP and geolocation data.
The index.php file calls the service to get the location data and populate them in the UI.
This is the home page code which contains the HTML code to acknowledge users with the current geolocation data.
It imports the location service class and invokes the methods to get and validate the IP address.
Once the IP is validated and returns true, it requests the geolocation data. Or else, it will display the error message to the UI.
index.php
<?php
require_once 'lib/Request.php';
$requestModel = new Request();
$ip = $requestModel->getIpAddress();
$isValidIpAddress = $requestModel->isValidIpAddress($ip);
?>
<HTML>
<HEAD>
<TITLE>Get Geo Location by the IP address</TITLE>
<link href="assets/css/style.css" type="text/css" rel="stylesheet" />
</HEAD>
<BODY>
<div class="txt-heading">Get Geo Location by the IP address</div>
<?php
if ($isValidIpAddress == "") {
echo "<div class='error'>Invalid IP address $ip</div>";
} else {
$geoLocationData = $requestModel->getLocation($ip);
print "<PRE>";
print_r($geoLocationData);
?>
<div id="location">
<div class="geo-location-detail">
<div class="row">
<div class="form-label">
Country Name: <?php echo $geoLocationData['country'];?>
</div>
</div>
<div class="row">
<div class="form-label">
Country Code: <?php echo $geoLocationData['country_code'];?>
</div>
</div>
<div class="row">
<div class="form-label">
Ip Address: <?php echo $geoLocationData['ip'];?>
</div>
</div>
</div>
</div>
<?php }?>
</BODY>
</HTML>
The getipaddress() function builds an if-else-if ladder of the majority of the scenario to get the non-empty IP address using the $_SERVER variable.
Once the IP is validated and returns true, the getLocation() function requests the ipwhois API via the PHP cURL.
The API will return a JSON response as a result. This example decodes the JSON response and parses the geolocation data to get the country details from it.
lib/Request.php
<?php
class Request
{
public function getIpAddress()
{
$ipAddress = '';
if (! empty($_SERVER['HTTP_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) {
// check for shared ISP IP
$ipAddress = $_SERVER['HTTP_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// check for IPs passing through proxy servers
// check if multiple IP addresses are set and take the first one
$ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ipAddressList as $ip) {
if ($this->isValidIpAddress($ip)) {
$ipAddress = $ip;
break;
}
}
} else if (! empty($_SERVER['HTTP_X_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_X_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_X_FORWARDED'];
} else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED_FOR'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (! empty($_SERVER['HTTP_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED'];
} else if (! empty($_SERVER['REMOTE_ADDR']) && $this->isValidIpAddress($_SERVER['REMOTE_ADDR'])) {
$ipAddress = $_SERVER['REMOTE_ADDR'];
}
return $ipAddress;
}
public function isValidIpAddress($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}
return true;
}
public function getLocation($ip)
{
$ch = curl_init('http://ipwhois.app/json/' . $ip);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close($ch);
// Decode JSON response
$ipWhoIsResponse = json_decode($json, true);
// Country code output, field "country_code"
return $ipWhoIsResponse;
}
}
The below images show the location data with the country name, and code.
If the IP address is not a valid one, then the code will return the error message to acknowledge the user.
These are some of the alternatives API provides services to access location data programmatically.
PHP supports integrating the GeoIP2 package of the PECL extension to get the location data by using predefined functions. The code to get the country name from the IP address or domain name is,
geoip_country_name_by_name ( $hostname );
Thanks
Welcome Zafer.
thanks a lot
Welcome Jonywan Tan.