INET_ATON() et INET_NTOA() en PHP?
Je veux stocker les adresses IP dans ma base de données, mais j'ai aussi besoin de les utiliser tout au long de ma demande. J'ai lu sur l'utilisation de INET_ATON()
et INET_NTOA()
dans mes requêtes MySQL pour obtenir un 32 bits entier non signé d'une adresse IP, ce qui est exactement ce que je veux qu'il sera à la recherche par le biais de la base de données plus rapide que l'utilisation de char(15).
La chose est, je ne peux pas trouver une fonction qui fait la même chose en PHP. La seule chose que je suis tombé sur:
http://php.net/manual/en/function.ip2long.php
J'ai donc testé:
$ip = $_SERVER['REMOTE_ADDR'];
echo ip2long($ip);
Et il ne sort rien. Dans l'exemple qu'ils ont donné, cela semble fonctionner, mais encore une fois je ne suis pas sûr si ip2long()
fait la même chose que INET_ATON()
.
Quelqu'un sait-une fonction PHP qui va le faire? Ou même une nouvelle solution de stockage d'une adresse IP dans une base de données?
Grâce.
- Oublié à ajouter, je suis en train de travailler sur localhost, donc peut-être que c'est pourquoi ip2long() ne renvoie rien?
- L'IPv4 de localhost est toujours 127.0.0.1, il devrait fonctionner, sauf si vous utilisez IPv6 - vérifier ma réponse.
Vous devez vous connecter pour publier un commentaire.
La
ip2long()
etlong2ip()
fonctions devrait fonctionner parfaitement.Remarque : vous devez utiliser ceux pour les adresses IPv4 -- assurez-vous que, dans votre cas,
$_SERVER['REMOTE_ADDR']
contient en fait un valide l'adresse IPv4 (et pas d'IPv6-stuff).Essayer sur une google adresse IP :
J'obtiens le résultat suivant :
Il existe une distinction importante entre
ip2long
,long2ip
et les fonctions de MySQL.PHP
ip2long
etlong2ip
traiter des nombres entiers signés.Voir http://php.net/manual/en/function.ip2long.php
MySQL
INET_ATON()
etINET_NTOA()
traiter avec des entiers non signésVoir http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton
Voici quelques fonctions que vous pouvez utiliser pour travailler entre les deux.
Si vous avez inséré dans la base de données MySQL, un IP à l'aide de
INET_ATON()
, vous pouvez la convertir en PHP en utilisant la suivante:Et vous pouvez le convertir en pour l'enregistrer dans la base de données à partir de PHP en utilisant ceci:
(Aussi important, ne tapez pas-cast le
$ip_address
àint
car cela pourrait causer des problèmes en les enveloppant le nombre si c'est plus grand queMAX_INT
. Si vous devez vous lancer, jeter unlong
oufloat
)ip2long
sur un système 64 bits donnera un unsigned résultat. "%u" va encore faire la bonne chose dans ce cas.Vous ne devriez pas avoir à traiter avec cela à l'intérieur de PHP, c'est ce natif MySQL funcions sont pour. Voir cet exemple:
Si vous voulez traiter à la fois ipv4 et ipv6 dans le même domaine, et que vous utilisez Mysql 5.6 ou plus, vous pouvez utiliser varbinary(16) et les fonctions inet6_aton et inet6_ntoa. C'est un meilleur exemple de pourquoi vous devriez utiliser les fonctions MySQL et ne pas faire face à des données binaires à l'intérieur de PHP:
Vous pouvez voir qu'en faisant cela, vous pouvez effectivement éviter d'avoir à évaluer des adresses ipv6 dans différents formats, depuis MySQL convertit en binaire et de retour à leur plus simple expression.
Je sais que cette question a plus de 2 ans déjà, mais je veux que cette information sera utile pour d'autres personnes qui viennent de partout.
HTH
Francisco Zarabozo
INET_ATON(?)
, donc vous devez utiliser phpPour IPv4 et IPv6 utilisation
inet_pton()
etinet_ntop()
, ces sont disponible depuis PHP 5.1+ et reproduire exactement l'équivalent fonctions MySQL.Sinon il suffit d'utiliser
ip2long()
etlong2ip()
.Ici PHP fonctions alternatives (simple copier/coller dans votre programme) -
ip2long est équivalent à inet_aton().
ip2long ne fonctionne qu'avec IPv4. Je soupçonne que votre système est à l'aide de IPv6 pour le bouclage. Essayez d'imprimer REMOTE_ADDR.
$_SERVER['REMOTE_ADDR']
retourne:::1
. Probablement parce que je suis sur localhost. Est-il un moyen pour éviter cela? Ou dois je faire une vérification pour voir si elle est de retour::1
?