Connaître le pays d’une adresse IP

Il est parfois utile de pouvoir localiser géographiquement une adresse IP. Cela peu par exemple être utile pour localiser un visiteur ou pour localiser des serveurs. Cet article présente deux tutoriaux PHP qui exploite une base de donnée pour associer une adresse IP à son pays.

Base de données pays

Intérêt de localiser une adresse IP

Il y a plusieurs raisons qui motivent l'utilisation de la localisation de l'adresse IP. La liste ci-jointe n'est pas exhaustive mais inclue des exemples d'utilisations très probables:

  • Localiser le visiteur d'un site web. Avec cette information il est possible de personnaliser le contenu pour cet internaute (utiliser l'unité monétaire de son pays, suggérer une version du site dans la langue officielle de son pays ...).
  • Cibler l'audience d'une annonce en ligne.
  • Détection automatique d'un champ de formulaire (exemple: choix du pays pré-remplis).
  • Connaitre l'emplacement géographique du serveur d'un site web (exemple: peut être utile pour le référencement).
  • Filtrer les visiteurs selon leur localité.
  • Réduire le spam / Réduire les fraudes bancaires.

Base de données

Pour associer une adresse IP à un pays, il faut se baser sur une base de données qui répertorie des plages d'adresses IP à un pays. La base de données de IP-to-Country (anciennement ip-to-country.com) est relativement précise, complète et mise à jour régulièrement.

Pour réaliser les tutoriaux présents dans la suite de cet article, il est indispensable de télécharger la base de données suivante et de la mettre en place sur son espace d'hébergement.

(Base de données SQL de 5,23Mo)

Pays d'origine d'un visiteur

L'utilisation la plus populaire de cette base de données consiste à localiser le pays d'origine d'un visiteur. Le code PHP suivant fonctionne avec PHP 5.

<?php
/* Message de copyright obligatoire: "This 'work' uses the IP-to-Country Database provided by WebHosting.Info (http://www.webhosting.info), available from http://ip-to-country.webhosting.info." */ // Connexion à la base de donnée (à adapter) $link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = $_SERVER['REMOTE_ADDR']; // Adresse IP du visiteur
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du visiteur

mysqli_close($link);
?>

Localisation d'un serveur

Pour une application ou pour le référencement, il peut se révéler utile de savoir dans quel pays se situe le serveur d'un site web. En connaissant le nom de domaine d'un site, le code suivant retourne l'adresse IP du serveur. Cette adresse IP peut alors permettre de localiser le serveur grâce à la base de données.

<?php
/* Message de copyright obligatoire: "This 'work' uses the IP-to-Country Database provided by WebHosting.Info (http://www.webhosting.info), available from http://ip-to-country.webhosting.info." */ // Connexion à la base de donnée (à adapter) $link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = gethostbyname('www.infowebmaster.fr'); // Adresse IP du serveur du site www.infowebmaster.fr
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du serveur

mysqli_close($link);
?>

Il est possible de constater que ce code diffère très peu du code précédent qui consistait à déterminer le pays d'origine d'un visiteur.

Continuation

Cette base de données est très intéressante mais possède l'inconvénient d'être exclusivement en anglais. De plus, les pays sont écrits en majuscules, ce qui n'est pas très esthétiques et facile à lire. Il est possible d'améliorer ce travail en créant une base de données permettant de traduire le nom des pays.

Mise à jour 21 février 2010: Pour traduire le nom des pays en français, j'ai créé une base de données de traduction de IP-to-Country. Cela est idéal pour afficher convenablement le nom des pays aux visiteurs.

Commentaires

bonjour

je cherche à filtrer les ip de pays étrangers éloignés qui consultent mon site (quelques pages de vente en ligne d'arbres) car je doute que ces consultations soient pertinentes. Je vais esayer d'utiliser votre programme, maisil faudra le mettre à jour (les codes php ont peut être évolué).
merci

lesarbres - 3 janvier 2014 à 14h51

Bonjour,
Auriez-vous la base de données plus à jour ?

@Lesarbres, je pense que si vous êtes à même de comprendre le code, ce qui est important c'est simplement la base de données 😉 ... enfin ceci n'est qu'un avis de développeur

Floppy - 19 février 2014 à 11h31

Je possède une table où les 251 y sont répertorié en chinois, français anglais, espagnol et allemand !
un enregistrement en exemple :
1 | AD | 1;0;1;0;0 | Andorre | 安道尔 | Andorra | Andorra | Andorra
le champ 2 est le code pays identique à la table ip-to-country donc facile pour "mixer" les deux tables !
le champ N° à pour but de lier les "régions" "départements" et "villes"...
A la disposition de qui le demande...
Merci pour ce tuto que je vais m'empresser d'insérer dans la procédure que je viens de finir pour la gestion des ouverture de mails et des clicks suite à mass mailing...

Claude

Claude - 3 septembre 2014 à 15h52

pourquoi ne pas utiliser ip2long /long2ip de php ou INET_ATON() et INET_NTOA() ?

Claude

Claude - 3 septembre 2014 à 16h05

Leave a comment