par
Berzemus » 18 avr. 2016, 10:08
Une adresse IP étant une donnée d'un genre particulier et très courant, des opérations adaptées existent déjà (sans oublier les
masques de sous-réseau).
MySQL par exemple offre
inet_aton(), qui traduit une adresse IP en valeur numérique, donc facilement et rapidement comparable.
Genre:
Select RowID, IP_ADDR where INET_ATON(IP_ADDR) >= INET_ATON('123.123.123.0') AND INET_ATON(IP_ADDR) <= INET_ATON('123.123.123.255');
C'est propre, bien plus rapide, et y'a même l'avantage que ça ne marche qu'avec des IP valides. De plus, cette méthode offre même une possibilité de fonctionner avec les adresses IPv6 via
inet6_aton()
Edit: Y'a pas de raisons de ne pas profiter de la syntaxe SQL pour enjoliver tout ca:
SELECT
MaTable.RowID,
INET_ATON(MaTable.IPAddr) AS IP_int,
INET_ATON('123.123.123.0') AS IP_min,
INET_ATON('123.123.123.255') AS IP_max
FROM MaTable
WHERE IP_int >= IP_min AND IP_int <= IP_max;
Par ailleurs, il ne reste plus qu'à convertir une adresse IP et son masque de sous-réseau en adresse de début et adresse de fin, fin prêts pour être utilisés avec INET_ATON. C'est élégant et parfaitement standard. C'est con, mais c'est le genre de solution qu'après presque une décennie de développement je privilégie malgré un effort initial plus important.
Une adresse IP étant une donnée d'un genre particulier et très courant, des opérations adaptées existent déjà (sans oublier les [url=https://fr.wikipedia.org/wiki/Sous-r%C3%A9seau]masques de sous-réseau[/url]).
MySQL par exemple offre [url=http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton]inet_aton()[/url], qui traduit une adresse IP en valeur numérique, donc facilement et rapidement comparable.
Genre:
[sql]Select RowID, IP_ADDR where INET_ATON(IP_ADDR) >= INET_ATON('123.123.123.0') AND INET_ATON(IP_ADDR) <= INET_ATON('123.123.123.255');[/sql]
C'est propre, bien plus rapide, et y'a même l'avantage que ça ne marche qu'avec des IP valides. De plus, cette méthode offre même une possibilité de fonctionner avec les adresses IPv6 via [url=http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-aton]inet6_aton()[/url]
Edit: Y'a pas de raisons de ne pas profiter de la syntaxe SQL pour enjoliver tout ca:
[sql]SELECT
MaTable.RowID,
INET_ATON(MaTable.IPAddr) AS IP_int,
INET_ATON('123.123.123.0') AS IP_min,
INET_ATON('123.123.123.255') AS IP_max
FROM MaTable
WHERE IP_int >= IP_min AND IP_int <= IP_max;[/sql]
Par ailleurs, il ne reste plus qu'à convertir une adresse IP et son masque de sous-réseau en adresse de début et adresse de fin, fin prêts pour être utilisés avec INET_ATON. C'est élégant et parfaitement standard. C'est con, mais c'est le genre de solution qu'après presque une décennie de développement je privilégie malgré un effort initial plus important.