Il peut être utile de garder une trace de l’adresse IP d’un point de vue de sécurité ou lorsqu’on souhaite rediriger un visiteur sur base géographique*.
Voici donc comment récupérer une adresse IP distante dans le langage PHP et la stocker dans une base de données.
La première manière de récupérer l’adresse IP est la suivante:
$ip = @$REMOTE_ADDR;
$REMOTE_ADDR est une variable globale qui est pré-initialisée lors du chargement de page. L’arobase ici est utilisé pour masquer d’éventuelles erreurs lors de la récupération du contenu de la variable. Cette manière ne fonctionne que si register_global est vrai au niveau du fichier ini, ce règlage pouvant être vérifié en consultant phpinfo (consultez cette page du manuel pour la création d’un fichier phpinfo). Lorsque register_global est faux on utilise cette seconde approche:
$ip = $_SERVER['REMOTE_ADDR'];
Il s’agit ici d’explicitement récupérer la valeur de REMOTE_ADDR auprès du serveur. Si vous souhaitez avoir une plus grande flexibilité il suffit de constituer la fonction suivante.
if( !ini_get('register_globals') ) {
return $_SERVER['REMOTE_ADDR'];
} else {
return @$REMOTE_ADDR;
}
return "";
}
Pour le stockage, il existe plusieurs possibilités mais le PHP fournit les deux fonctions assez intéressantes que sont ip2long et long2ip. Celles-ci permettent de respectivemment transformer une addresse IPv4 en entier long et d’effectuer l’opération inverse. Si vous utilisez MySQL il existe les fonctions équivalentes inet_aton et inet_ntoa.
Dans PHP
$ip = ‘127.0.0.1’;
$ip_value = ip2long($ip);
echo $ip_value;
echo long2ip($ipValue);
// Informations supplémentaires
$nom_page = « La page de toto »;
$heure = time();
$ip = getRemoteIp();
$sql = « INSERT INTO visiteurs(heure, ip, nom_page) VALUES (‘$heure’,$ip’,’$nom_page’) »;
$test = mysql_query( $sql );
A tester dans MySQL
select inet_aton(‘127.0.0.1′)
select inet_ntoa(‘2130706433′)
Pour le stockage dans une table SQL vous pouvez utiliser ces définitions de champ la deuxième étant la plus intéressante pour minimiser le volume de stockage nécessaire. Assurez-vous bien que le deuxième champ soit défini en tant que entier non signé car autrement une addresse IP dont le premier nombre est supérieur à 128 sera tronqué lors d’une conversion à une valeur maximale de (2^31)–1.
`ip` varchar(15) NOT NULL default » COMMENT ‘IPv4′,
`ip_valeur` int(11) unsigned NOT NULL DEFAULT 0 COMMENT ‘Non signé’,
* Consultez cet article de Hugo ETIEVANT pour savoir comment utiliser le IP-to-Country.
– James Poulson.