Question

Quelle est la meilleure pratique pour stocker des adresses IP avec PHP dans une base MySQL? Il y a une fonction appelée ip2long - mais cela est juste pour IPv4. Mais qu'en est-IPv6?

Je sais une fonction php qui est pour IPv6 IP de, mais il ne fonctionne pas sur Windows avec PHP

Était-ce utile?

La solution

L'adresse IPv4 notation décimale peut être converti en un nombre entier, avec une taille maximale de 32 bits. Les adresses IPv6 sont 128 bits. Étant donné que 128 bits ne rentrent pas dans un int PHP, ce sera une douleur à travailler avec PHP.

Si vous voulez juste pour se connecter et utiliser des adresses IPv6, vous épargner la peine et les enregistrer sous forme de texte. Si vous souhaitez appliquer et calculer netmask les sous-réseaux, vous devez les convertir.

Autres conseils

Knittl était plus proche, au lieu d'utiliser binaire (16) varbinary ( 16) user196009 répondu dans une question connexe. Ça marche pour moi. Comment?

Stockage IP:

<?php
  $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google's IP address
  // using a PDO wrapper. http://www.phpclasses.org/package/5206-PHP-Execute-database-queries-from-parameters-using-PDO.html
  include_once 'db.php';
  $c = new DB();
  $visit = $c->getResults($query); // stored as binary
?>

remontants:

<?php
  $query = "SELECT `vis_ip` FROM `stats` WHERE `id_stat`=1";
  // PDO wrapper
  include_once 'db.php';
  $c = new DB();
  $stats = $c->getRow($query);
  echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104
?> 

Il doit travailler avec des adresses IPv6 (j'ai une connexion IPv4). Je ne suis pas un expert, donc je ne sais pas encore si la longueur varbinary est correcte, mais comment je l'ai dit, il fonctionne pour moi.

Afin de vérifier si 'IPv6' est activé dans votre version de PHP / hôte:

<?php
  phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php
?> 

il y a la fonction php inet_pton , il tournera une chaîne d'adresse IP dans sa représentation binaire (pour les ipv4 et ipv6). vous pouvez ensuite le stocker sous forme binary(16) dans votre base de données MySQL.

pour obtenir à nouveau une adresse lisible par l'homme, l'utilisation inet_ntop

Notez que MySQL (5.6) prennent désormais en charge les adresses IPv6 , voir INET6_ATON () .

Le deuxième commentaire manuel de fonction ip2long que vous avez une fonction appelée ip2long6 pour IPv6 (et il y a plus bas).

Vous pouvez simplement le stocker sous forme de chaîne dans un CHAR je suppose que

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top