将IPv6存储在数据库中

时间:2010-01-12 14:37:55

标签: php mysql ip ipv6

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

我知道用于IPv6 IP的php功能, 但它不能在Windows上使用PHP<版本5.3

6 个答案:

答案 0 :(得分: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长度是否正确,但我怎么说,它对我有用。

为了检查您的PHP版本/主机中是否启用了“IPv6支持”:

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

答案 1 :(得分:9)

点分十进制IPv4地址可以转换为整数,最大大小为32位。 IPv6地址是128位。由于128位不适合PHP int,因此在PHP中使用会很麻烦。

如果您只想连接并使用IPv6地址,请省去麻烦并将其另存为文本。如果要应用网络掩码并计算子网,则需要转换它们。

答案 2 :(得分:9)

有php函数inet_pton,它会将ip地址字符串转换为二进制表示形式(对于ipv4和ipv6)。然后,您可以将其作为binary(16)存储在mysql数据库中。

要再次获取人类可读的地址,请使用inet_ntop

答案 3 :(得分:2)

请注意, MySQL (5.6)现在支持 IPv6地址,请参阅INET6_ATON()

答案 4 :(得分:0)

ip2long功能手册的第二条评论中,您有一个名为ip2long6的{​​{1}}功能(下面还有更多内容)。

答案 5 :(得分:0)

您可以将其作为字符串存储在CHAR我想是