2010-01-12 9 views
15

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

Je sais une fonction php qui est pour des adresses IP IPv6, mais il ne fonctionne pas sur Windows avec PHP < Version 5.3

+3

Vérifiez cette question: http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql –

Répondre

9

L'adresse IPv4 décimale pointée peut être converti en un 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 difficile de travailler avec PHP.

Si vous souhaitez simplement vous connecter et utiliser les adresses IPv6, sauvegardez-les et sauvegardez-les au format texte. Si vous souhaitez appliquer des masques de réseau et calculer des sous-réseaux, vous devez les convertir.

+0

Quelle taille du texte? – User

+4

[45 caractères] (http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address). – Sjoerd

0

Le deuxième commentaire au manuel fonction ip2long vous avez une fonction appelée ip2long6 pour IPv6 (et il y en a plus ci-dessous).

+0

être conscient que vous avez besoin gmp-lib pour cette fonction –

0

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

9

il y a la fonction php inet_pton, il transformera une chaîne d'adresse IP en sa représentation binaire (pour ipv4 et ipv6). vous pouvez ensuite le stocker comme binary(16) dans votre base de données mysql. dans une question connexe

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

12

knittl était plus proche, au lieu de binaire (16) utilisent varbinary (16) user196009 answered. Ça marche pour moi. Comment?

IP Stockage:

<?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 
?> 

Récupération IP:

<?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 devrait fonctionner 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, ça marche pour moi.

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

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

Au lieu d'utiliser PHP, vous pouvez maintenant utiliser [INET6_ATON] de MySQL (http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton) pour convertir la chaîne en numérique représentation pour MySQL> = 5.6. – Mike

2

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