Trucs et Astuces wHo-et-Be

cliquez pour 
ouvrir le menu
Développement Web > PHP > Ip2Country
Pour connaitre le pays d'origine d'une adresse IP, il existe une base " ip-to-country" qui est mise à jour tous les mois.
http://ip-to-country.webhosting.info
C'est un fichier CSV qu'il faut importer dans sa propre base de données, ensuite une requête simple permet de récupérer le code du pays ainsi que son libellé.

Créer la table dans phpMyAdmin

Exécuter la requête SQL suivante :

CREATE TABLE `i2c` (
`IP_FROM` double NOT NULL default '0',
`IP_TO` double NOT NULL default '0',
`COUNTRY_CODE` char(2) NOT NULL default '',
`COUNTRY_CODE2` char(3) NOT NULL default '',
`COUNTRY_NAME` varchar(64) NOT NULL default '',
PRIMARY KEY (`IP_FROM`,`IP_TO`)
)
Vous pouvez nommer la table comme vous le souhaitez.

Importer / mettre à jour la table

Télécharger la dernière mise à jour du fichier ip-to-country.csv.zip (474 Ko)

Extraire le fichier .csv dans un répertoire de votre choix.

Dans phpMyAdmin :

- Cliquer sur la table i2c (ou le nom que vous lui avez donné)
- En bas de la fenêtre de Propriétés,cliquer sur le lien :
   " Insérer des données provenant d'un fichier texte dans la table "

- Sélectionner le fichier (extrait précédemment)
- Cocher la case " Remplacer "
- Champs terminés par : mettre une virgule " , " au lieu du point-virgule
- Lignes terminées par : mettre " \n " au lieu de " \r\n "
- Cliquer sur Exécuter : phpMyAdmin télécharge le fichier et insère les éléments dans la table.
 

Si vous obtenez l'erreur :

The used command is not allowed with this MySQL version

C'est que les administrateurs de phpMyAdmin ont bloqué cette fonctionnalité...
il faut alors ruser !


Mettre à jour votre table sans l'importation.
Ouvrir le fichier .csv avec son éditeur de textes préféré [ ni Notepad, ni Word... un vrai éditeur ! ]

Il faut transformer les lignes de données

"33996344","33996351","GB","GBR","UNITED KINGDOM"
en ajoutant la commande SQL " INSERT INTO table VALUES... "
INSERT INTO i2c VALUES ("33996344","33996351","GB","GBR","UNITED KINGDOM")
 
Si votre éditeur gère le chercher/remplacer avec des multi lignes :
Chercher (les " de la fin et du début) : "
"
Remplacer : ")
INSERT INTO i2c VALUES ("
S'il votre éditeur gère les macros, il faut :
Insérer au début : INSERT INTO i2c VALUES ("
Aller à la fin, ajouter : )
Revenir au début et descendre d'une ligne.  
Et répéter la macro jusqu'en bas.
 
Sur la première ligne, on va ajouter une commande pour vider la table :
TRUNCATE i2c

Enregistrer le fichier, puis dans phpMyAdmin :

- cliquer sur le lien SQL
- sélectionnez le fichier .csv
- cliquer Exécuter

Si vous obtenez l'erreur :

Expiration de délai CGI
L'application CGI spécifiée a dépassé le temps autorisé pour le traitement.
Le serveur a supprimé le processus.

C'est que le script met trop de temps à s'éxécuter (il contient plus de 57000 lignes, donc 57000 requètes sql...) Il suffit de diviser en fichiers de 20000 lignes environ et de les éxécuter les uns après les autres.

Récupérer l'information
On ne s'est pas cassé la tête pour ne pas s'en servir :

En PHP, éxécuter le code suivante (après bien sur avoir ouvert la connexion à la base) :

$ip1 = $_ENV["REMOTE_ADDR"];
$dotted = preg_split( "/[.]+/", $ip1);
$ip2 = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);

$row = @mysql_fetch_array(mysql_query("SELECT `COUNTRY_NAME`,COUNTRY_CODE
FROM i2c WHERE $ip2 BETWEEN `IP_FROM` AND `IP_TO`"));

$CC = $row['COUNTRY_CODE'];
$CN = $row['COUNTRY_NAME'];

Les variables $CC et $CN contiennent alors le Code du Pays et le Libellé.
Signifie que la ligne est visuellement coupée : il faut tout laisser sur la même ligne.

Voir aussi...
http://d1.a.free.fr/en/how_to.php#ip2country

  visites   Yahoo Me!ICQ Me!Skype Me!MSN Live Messenger Me! Accueil