PHP 中的 INET_ATON() 和 INET_NTOA()?

2022-08-30 13:14:47

我想将 IP 地址存储在我的数据库中,但我还需要在整个应用程序中使用它们。我读到过在我的MySQL查询中使用和从IP地址中获取32位无符号整数的信息,这正是我想要的,因为它将使搜索数据库比使用char(15)更快。INET_ATON()INET_NTOA()

问题是,我找不到一个在PHP中做同样事情的函数。我唯一遇到的是:

http://php.net/manual/en/function.ip2long.php

所以我测试了它:

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

它什么也没输出。在他们给出的示例中,它似乎有效,但话又说回来,我并不完全确定是否与.ip2long()INET_ATON()

有人知道一个PHP函数可以做到这一点吗?甚至是将IP地址存储在数据库中的全新解决方案?

谢谢。


答案 1

和 MySQL 函数之间有一个重要的区别。ip2longlong2ip

PHP 和处理有符号整数。ip2longlong2ip

查看 http://php.net/manual/en/function.ip2long.php

“因为PHP的整数类型是有符号的,并且许多IP地址在32位架构上会导致负整数,所以你需要使用sprintf()或printf()的'%u'格式化程序来获取无符号IP地址的字符串表示。

MySQL和处理无符号整数INET_ATON()INET_NTOA()

查看 http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton

“要存储由 INET_ATON() 生成的值,请使用 INT 无符号列,而不是有符号的 INT。如果使用有符号列,则无法正确存储与第一个八位字节大于 127 的 IP 地址对应的值。

以下是一些可用于在两者之间工作的函数。

如果插入到 MySQL 数据库中,则使用 一个 IP,则可以使用以下方法将其转换回 PHP:INET_ATON()

long2ip(sprintf("%d", $ip_address));

您可以使用以下命令将其转换为PHP的数据库:

sprintf("%u", ip2long($ip_address));

(同样重要的是,不要将 to 类型转换为,因为如果数字大于 ,则可能会通过包装数字来引起问题。如果必须将其投射到或$ip_addressintMAX_INTlongfloat)


答案 2

ip2long()long2ip() 函数应该可以正常工作。

注意:您应该将这些用于IPv4地址 - 确保在您的情况下,实际上包含有效的IPv4地址(而不是某些IPv6-stuff)。$_SERVER['REMOTE_ADDR']


尝试使用谷歌IP地址:

var_dump(ip2long('209.85.227.147'));
var_dump(long2ip(3512066963));

我得到以下输出:

int(3512066963)
string(14) "209.85.227.147" 

推荐