在MySQL数据库中使用PHP存储IP的最佳实践是什么? 有一个称为ip2long的函数 - 但这仅适用于IPv4。 但是IPv6呢?在数据库中存储IPv6
我知道一个PHP函数,对IPv6的IP的, 但它不能在Windows与PHP <版本5.3
在MySQL数据库中使用PHP存储IP的最佳实践是什么? 有一个称为ip2long的函数 - 但这仅适用于IPv4。 但是IPv6呢?在数据库中存储IPv6
我知道一个PHP函数,对IPv6的IP的, 但它不能在Windows与PHP <版本5.3
点分十进制IPv4地址可以被转换成整数,具有32位的最大尺寸。 IPv6地址是128位。由于128位不适合PHP int,所以在PHP中使用这将会很麻烦。
如果您只想连接并使用IPv6地址,请将问题保存并保存为文本。如果你想应用网络掩码和计算子网,那么你需要转换它们。
你可以只将其存储为一个CHAR
字符串我想
这里有php函数inet_pton
,它会将一个ip地址字符串变成它的二进制表示(对于ipv4和ipv6)。你可以将它作为binary(16)
存储在你的mysql数据库中。
再次获得人类可读地址,使用inet_ntop
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
?>
现在,您可以使用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
注意MySQL的(5.6)现在支持IPv6地址,看到INET6_ATON()。
看看这个问题:http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql – 2010-01-12 14:39:06