注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

PHP解决IP2数字互相转换因数字太大而产生负数的办法  

2017-06-16 15:32:06|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
先来说说,MySql自带了inet_aton函数来实现将ip地址转换为数字,inet_ntoa函数将数字转换为ip。同样PHP也有两个函数与之对应,那就是ip2long和long2ip2。在把ip数据保存在数据库(MySQL)中时候,通常习惯用ip2long函数生成整型,然后再存放在一个字段中,但是,在不同的系统平台上,因为ip2long函数得到的值是不同的【其实原因就在于,有时会超大溢出,将整数变成了负数】,这样保存的话,有可能造成在从数据库中读出数据,再用long2ip得到ip的时候会产生错误。
下面就来说说如何避免产生这种错误:
1)使用Mysql字段的时候不能用int(11)类型(范围-2147483648 - 2147483647),原因在于,例如,ip是’202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803,然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647。于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址。所以要使用bigint(20)字段来保存,当然如果为了避免负数的出现,请使用无符号。
2)当然也可以直接使用inet_aton函数来转换,不使用PHP的。
3)如果不保存到数据库,直接使用,又觉得负数不好的话,那就得按照PHP官方手册中提到, sprintf()或printf() 函数使用"%u"来进行转换【这两个函数要注意下使用方式】:

<?php

//原始结果是个负值

echo "ip2long=>".ip2long("202.101.224.68")."<br />";
//转为正值

echo "sprintf=>".sprintf("%u",ip2long("202.101.224.68"))."<br />";
//另一种方法

printf("printf=>%u<br />",ip2long("202.101.224.68"));

?>

4)或者还可以使用bindec和decbin两个函数进行转换。

<?php

//原始结果是个负值

echo "ip2long=>".ip2long("202.101.224.68")."<br />";

//转为正值

echo "bindec+decbin=>".bindec(decbin(ip2long("202.101.224.68") ));

?>

可以看看相应的函数执行结果如下:
PHP解决IP2数字互相转换因数字太大而产生负数的办法 - sinsunson - 天朝布衣田中码农参上
对比使用Mysql使用的函数inet_aton结果。

select inet_aton("202.101.224.68")

执行效果如下:
PHP解决IP2数字互相转换因数字太大而产生负数的办法 - sinsunson - 天朝布衣田中码农参上
好了,就会发现,这样才是我们想要的效果。



  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017