2010-01-12 103 views
15

在MySQL数据库中使用PHP存储IP的最佳实践是什么? 有一个称为ip2long的函数 - 但这仅适用于IPv4。 但是IPv6呢?在数据库中存储IPv6

我知道一个PHP函数,对IPv6的IP的, 但它不能在Windows与PHP <版本5.3

+3

看看这个问题:http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql – 2010-01-12 14:39:06

回答

9

点分十进制IPv4地址可以被转换成整数,具有32位的最大尺寸。 IPv6地址是128位。由于128位不适合PHP int,所以在PHP中使用这将会很麻烦。

如果您只想连接并使用IPv6地址,请将问题保存并保存为文本。如果你想应用网络掩码和计算子网,那么你需要转换它们。

+0

什么大小的文字? – User 2012-10-09 16:52:21

+4

[45个字符](http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address)。 – Sjoerd 2012-10-10 07:16:56

0

ip2long功能手册上工作的第二个意见,你有一个名为ip2long6IPv6功能(和下面还有更多)。

+0

请注意,您需要该功能的gmp-lib – 2010-01-12 16:55:04

0

你可以只将其存储为一个CHAR字符串我想

9

这里有php函数inet_pton,它会将一个ip地址字符串变成它的二进制表示(对于ipv4和ipv6)。你可以将它作为binary(16)存储在你的mysql数据库中。

再次获得人类可读地址,使用inet_ntop

12

knittl更接近,在一个相关的问题,而不是二进制(16)用VARBINARY(16)user196009 answered。这个对我有用。怎么样?

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

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

应该使用IPv6地址的工作(我有一个IPv4连接)。 我不是专家,所以我不知道如果varbinary长度是正确的,但我怎么说,它适用于我。

为了检查是否 'IPv6支持' 在你的PHP版本/主机启用:

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

现在,您可以使用MySQL的[INET6_ATON](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton)将字符串转换为其数字MySQL> = 5.6的表示。 – Mike 2014-06-21 17:20:53

2

注意MySQL的(5.6)现在支持IPv6地址,看到INET6_ATON()