Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ip4和ip6以不同的方式转换_Php_Ip_Ipv6 - Fatal编程技术网

Php ip4和ip6以不同的方式转换

Php ip4和ip6以不同的方式转换,php,ip,ipv6,Php,Ip,Ipv6,我想将IP的范围存储到数据库中。问题是有些IP是ipv4,有些是ipv6。我想将所有内容转换为ipv6,然后存储到数据库中。例如: 根据: 192.168.1.100=>0:0:0:0:ffff:c0a8:164 问题在于php以不同的方式处理它们: echo bin2hex(inet_pton('192.168.1.100')); c0a80164 echo bin2hex(inet_pton('0:0:0:0:0:ffff:c0a8:164')); 00000000000000000000

我想将IP的范围存储到数据库中。问题是有些IP是ipv4,有些是ipv6。我想将所有内容转换为ipv6,然后存储到数据库中。例如: 根据:

192.168.1.100=>0:0:0:0:ffff:c0a8:164

问题在于php以不同的方式处理它们:

echo bin2hex(inet_pton('192.168.1.100'));
c0a80164

echo bin2hex(inet_pton('0:0:0:0:0:ffff:c0a8:164'));
00000000000000000000ffffc0a80164

echo bin2hex(inet_pton('0000:0000:0000:0000:0000:0000:192.168.1.100'));
000000000000000000000000c0a80164

对我来说,在数据库中进行ip比较(特别是ipv4)是非常重要的。

我认为将ipv4地址完全像IPv6地址一样存储不是一个好主意

它们是完全不同的东西


如果您运行的服务器只在禁用了
IPv6的情况下侦听IPv6套接字,则可能会遇到
:ffff:
版本。然后,您会注意到IPv4主机
192.168.1.100
的身份连接:ffff:c0a8:164
。但是您不能通过IPv6连接到此地址-为此,您需要一个IPv4套接字。因此,最好以简短的形式存储地址,这样就更容易通过长度来区分它们。

我认为将IPv4地址完全像IPv6地址一样存储不是一个好主意

它们是完全不同的东西


如果您运行的服务器只在禁用了
IPv6的情况下侦听IPv6套接字,则可能会遇到
:ffff:
版本。然后,您会注意到IPv4主机
192.168.1.100
的身份连接:ffff:c0a8:164
。但是您不能通过IPv6连接到此地址-为此,您需要一个IPv4套接字。因此,最好以简短的形式存储地址,这样就更容易通过长度来区分它们。

IPv4地址与IPv6地址不同。你不能把一个变成另一个——它们是不同的野兽。PHP对待它们的方式不同并不奇怪。好吧,IPv6也与IPv4兼容。@werva那么你就知道错了。网络之间有网关,但通常是分开的。最好以简短的形式存储IPv4地址,以便更容易区分。@glglgl,那么你的意思是我应该将它们存储到两个不同的表中吗?@werva否,但可以作为varchar/varbinary,这样你可以立即检测不同的长度,甚至可以在连接时为地址族字段添加一个字节。但后者是可选的;如果只有IPv4和IPv6地址,则长度足够。IPv4地址与IPv6地址不同。你不能把一个变成另一个——它们是不同的野兽。PHP对待它们的方式不同并不奇怪。好吧,IPv6也与IPv4兼容。@werva那么你就知道错了。网络之间有网关,但通常是分开的。最好以简短的形式存储IPv4地址,以便更容易区分。@glglgl,那么你的意思是我应该将它们存储到两个不同的表中吗?@werva否,但可以作为varchar/varbinary,这样你可以立即检测不同的长度,甚至可以在连接时为地址族字段添加一个字节。但后者是可选的;如果你只有IPv4和IPv6地址,那么长度就足够了。我发现这个也很有用。我发现这个也很有用。