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.
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.