16

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

我知道一个用于 IPv6 IP 的 php 函数,但它不适用于 PHP < 5.3 版的 Windows

4

6 回答 6

12

knittl更接近,而不是 binary(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
?>

检索 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
?> 
于 2010-12-12T17:53:29.880 回答
9

点分十进制 IPv4 地址可以转换为整数,最大大小为 32 位。IPv6 地址为 128 位。由于 128 位不适合 PHP int,因此在 PHP 中使用这将是一件痛苦的事情。

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

于 2010-01-14T08:00:43.250 回答
9

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

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

于 2010-05-02T20:38:51.253 回答
2

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

于 2016-04-24T13:29:02.430 回答
0

在功能手册的第二条评论中,您需要ip2long一个功能(下面还有更多功能)。ip2long6IPv6

于 2010-01-12T14:41:51.360 回答
0

你可以把它作为一个字符串存储在CHAR我想

于 2010-01-12T16:53:48.987 回答