【问题标题】:Storing an IP as an unsigned int?将 IP 存储为无符号整数?
【发布时间】:2011-04-19 05:01:34
【问题描述】:

我读到在数据库中存储 IP 地址的最佳方法是创建一个 Unsigned Int(10) 字段。如何使用 PHP 转换 IP 地址?我试过使用

$this->ip = long2ip($_SERVER['REMOTE_ADDR']);

但这似乎不起作用。我找到了使用

将其转换回IP地址的方法
$this->ip = sprintf("%u", ip2long($result['ip']));

最初如何转换 IP 地址?我应该为此使用 PHP 吗?还是集成到 MySQL 查询中会更好?

【问题讨论】:

  • 那么根据这个问题最好的数据类型不是整数stackoverflow.com/questions/1038950/…
  • 不确定最好的数据类型,但在 Postgres 的情况下,我肯定会说最好的数据类型是Inet,而不是将其破解为其他任何东西。

标签: php sql optimization ip


【解决方案1】:

long2ip 将整数转换为 IP 格式,ip2long 则相反。

所以使用ip2long$_SERVER['REMOTE_ADDR']转换成整数存入数据库,从数据库中读取整数后使用long2ip

$long = ip2long($_SERVER['REMOTE_ADDR']);
$ip   = long2ip($long);

【讨论】:

  • 您的解释是正确的,但您在截图中的用法不正确。
【解决方案2】:

最好把这个逻辑放在你的 SQL 查询中:

INSERT INTO `table`
    (`ip`)
VALUES
    INET_ATON('192.168.0.1')

然后在选择数据时将地址隐蔽回来:

SELECT INET_NTOA(`ip`)
    FROM `table`

【讨论】:

  • +1,特别是因为它也应该支持 IPv6——尽管这可能永远不会成为现实:/
  • 使用 SQL 优于 PHP 有什么优势?
  • 好吧,如果可能的话,最好将与数据库存储相关的逻辑放在查询中。例如,如果您将 MySQL 服务器升级到新版本,并且数据存储方式将发生一些变化,这些变化也会反映在数据库函数中。如果您将此逻辑信任其他工具,您可能会遇到问题。但首先,它是任务的逻辑委派,以便您的代码更易于理解。
  • @Markus IPv6 今天已成为现实。非常稀有以至于我们无法依靠它,但又足够普遍以至于我们也无法依靠它不被使用。
【解决方案3】:

我用过这个

function ip2int($ip) {
    $a = explode(".",$ip);
    return $a[0] * 256 * 256 * 256 + $a[1] * 256 * 256 + $a[2] * 256 + $a[3];
}

【讨论】:

  • 这个比内置的好,imo,因为它没有遇到标志问题
【解决方案4】:

如果您使用的是 MySQL,则可以使用 INET_ATON(相当于 ip2long)和 INET_NTOA(long2ip)函数,而不是使用 PHP 进行处理:

【讨论】:

    【解决方案5】:

    您需要使用 ip2long 转换 IP 的点分字符串版本,然后使用 long2ip 转换回来。看起来你现在倒退了。

    $integer_ip = ip2long($_SERVER["REMOTE_ADDR"]); // => 1113982819
    $dotted_ip  = long2ip($integer_ip);             // => "66.102.7.99"
    

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2022-01-17
      • 2010-09-23
      • 2012-01-09
      相关资源
      最近更新 更多