将IPv6存储在数据库中

Por*_*oru 15 php mysql ip ipv6

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

我知道一个用于IPv6 IP的PHP函数,但它在使用PHP <Version 5.3的Windows上不起作用

qua*_*tme 12

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

存储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
?>
Run Code Online (Sandbox Code Playgroud)

检索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
?> 
Run Code Online (Sandbox Code Playgroud)

它应该与IPv6地址一起使用(我有一个IPv4连接).我不是专家所以我不知道varbinary长度是否正确,但我怎么说,它对我有用.

为了检查PHP版本/主机中是否启用了"IPv6支持":

<?php
  phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php
?> 
Run Code Online (Sandbox Code Playgroud)

  • 您现在可以使用MySQL的[INET6_ATON](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton)将字符串转换为数字表示,而不是使用PHP.对于MySQL> = 5.6. (2认同)

Sjo*_*erd 9

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

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

  • [45个字符](http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address). (4认同)

kni*_*ttl 9

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

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