background image

sprintf("%u",

ip2long

(

$ip

);

就能转换为正整数。而且得到的结果用 long2ip 也可以正常转换回原来的 ip 地址。也可以用

ip2long

来验证一个 ip 是否是有效的,如

 

复制代码 代码如下:
 
<?php

function

 chk_ip(

$ip

){

if

(

ip2long

(

$ip

)=="-1") {

return

 false;

}
returntrue;
}

//应用

var_export(chk_ip("10.111.149.42"));
var_export(chk_ip("10.111.256.42"));
?>
 
将输出 true 和 false
把 ip 数据保存在数据库(MySQL)中时候,我们习惯用

ip2long

函数生成整型,然后存放在一

个 int(11)类型的字段中,但是,在不同的系统平台上,

ip2long

函数得到的值是不同的,因此可

能造成在从数据库中读出数据,用 long2ip 得到 ip 的时候产生错误,说一下我们碰到的情况:
我们用一个 int(11)类型(范围-2147483648 -2147483647)来保存把一个 ip 地址用

ip2long

理得到的结果,例如 ip 是'202.105.77.179′,那么在 32 位机器上得到的结果是:-899068493,而
在 64 位机器上却得到 3395898803.然后把它写入数据库,由于超过 int(11)的范围,因此 64 位
机器上的结果被保存为 int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到
了错误的结果,

会得到 127.255.255.255″这个 ip 地址.

解决的办法很多,比如可以用 mysql 的函数:INET_ATON 和 INET_NTOA 来处理 ip 地址;或
者把保存 ip 地址的字段改为 bigint 类型,这样在 64 位机器上虽然保存的是 3395898803,使
用 long2ip 函数仍能得到正确的结果.