[RESOLU] Comparation IPv6 avec une base de données

Avatar du membre
Eléphant du PHP | 224 Messages

03 nov. 2020, 04:02

Hello,

Dans l'admin de mon site, j'ai les IP des visiteurs en "temps réel" (actualisé toutes les 10 secondes , de mémoire).
Par curiosité, je souhaiterais indiquer à coté de chaque IP, quel est le pays du visiteur (oui si il passe par un VPN c'est faussé, masi pas grave), histoire de savoir quels pays s'y intéressent.

Je sais qu'il existe des sites qui permettent d'avoir des infos de ce genre via un API qui retourne un fichier json, seulement pour tous ceux que j’ai regardé, ils sont limités en nombre de hits/minutes pour le service gratuit. J'utilise un de ces API pour des requêtes ponctuelles, mais là avec un truc qui récupères les infos de plusieurs ip toutes les 10 seconde,s je vais me faire kicker au bout de pas longtemps lol

Je compte donc contourner la limitation en utilisant une base de données régulièrement mise à jour, par exemple celle de software77.net.

Pour les IPv4, c'est ok, mais les IPv6, je galère pour le stockage et/ou la comparaison par rapport aux "ranges".

Pour faire la requête, j'ai ceci (simplifié) :

Code : Tout sélectionner

SELECT * FROM geotable LEFT JOIN geocountrycodes ON geocountrycodes.ctry = geotable.ctry WHERE ipfrom <= $ipbin AND ipto >= $ipbin AND iptype = 'IPv6' "
Dans laquelle ipbin est l'IPv6 convertie en binaire.
Les valeurs ipfrom et ipto sont aussi les débuts et fins de plages IPv6 converties en binaire.

Malheureusement, cela ne fonctionne pas car pour que les valeurs binaires puissent rentrer dans la DB, la colonne est au format "Text". (Bien que pourtant ca a l'air de fonctionner avec les IPv6 converties en valeurs décimales, mais aussi stockées dans le même type de colonne).

Je ne parviens pas à stocker sous une forme numérique (apparemment, même BIG INT , la valeur max est sur 64bits). J'ai tenté de splitter la valeur binaire de l'IPv6 en 8 pour stocker dans 8 colonnes BIG INT(64), mais du coup, le CONCAT dans le WHERE ne peut pas aller car les valeurs ne sont pas systématiquement sur 8 digits. Je suis revenu en arrière.

inet6_aton, ah bah pas de pot, il faut MySQL 5.6, or j'ai sur mon "serveur" dev c'est 5.5 (oui je sais, pas dernière version mais la fois où j'ai voulu mettre plus récent ca m'a mis aussi php et apache plus récent et ca m'a planté d'autres vieux scripts :( ).

Du coup je me retrouve un peu à court d'idées.

Si quelqu'un a une piste, je suis preneur :D

Merkouin !!!
Couin
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 nov. 2020, 13:21

Alors je ne connais pas celui-ci, donc je vais un peu botter en touche en te proposant une alternative.

La référence du marché pour ce genre de besoin c'est MaxMind qui a une version gratuite qui fonctionne en IPV4 et IPV6 :
https://dev.maxmind.com/geoip/geoip2/geolite2/

Et voici un exemple d'utilisation en PHP :
https://stackoverflow.com/a/26244493
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 224 Messages

05 nov. 2020, 17:06

Hello @rthur
Merci pour ta réponse , je vais regarder ca , mais si en effet il n'y a pas besoin de passer par la DB ca devrait être plus simple du coup !
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 nov. 2020, 08:36

Effectivement, tout est contenu dans un fichier, du coup ça facilite aussi les mises à jour.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 224 Messages

07 nov. 2020, 08:30

Hello,

Bon, ai pu tester, c'est good :)
J'ai mis 2 versions avec une détection de version php pour choisir automatiquement la plus récente du reader, pour le site, et une plus ancienne pour mon serveur sur lequel je dev, afin que ça ne mette pas en carafe par incompréhension de la dernière version.

Merci , au top :)
A la prochaine :D
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen: