PHP基于ip2long实现IP转换整形

 更新时间:2020年12月11日 09:52:27   作者:ノGHJ  
这篇文章主要介绍了PHP基于ip2long实现IP转换整形,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如

<?php
echo ip2long("10.2.1.3");
?>

我们将得到

167903491

这是如何计算的,目前我知道有两个算法。其一

<?php
function ip2int($ip){
  //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4
  list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
  //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256
  //这即是我们得到的值
  return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
?>

其二,用位运算

<?php
function ip2int($ip){
  list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
  return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);
}
?>

我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用
sprintf("%u",ip2long($ip);

就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如

<?php
function chk_ip($ip){
  if(ip2long($ip)=="-1") {
    return false;
  }
  return true;
}
//应用
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函数仍能得到正确的结果.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • PHP下载文件的函数实例代码

    PHP下载文件的函数实例代码

    本文通过实例代码给大家介绍php下载文件的函数相关知识,介绍的非常详解,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05
  • main.php

    main.php

    main.php...
    2006-12-12
  • PHP explode()函数的几个应用和implode()函数有什么区别

    PHP explode()函数的几个应用和implode()函数有什么区别

    这篇文章主要介绍了PHP explode()函数的几个应用和implode()函数有什么区别,需要的朋友可以参考下
    2015-11-11
  • 浅谈Laravel模板实体转义带来的坑

    浅谈Laravel模板实体转义带来的坑

    今天小编就为大家分享一篇浅谈Laravel模板实体转义带来的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • PHP微信支付开发实例

    PHP微信支付开发实例

    这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • php in_array() 检查数组中是否存在某个值详解

    php in_array() 检查数组中是否存在某个值详解

    php有时候需要判断某一个值是否存在于数组中,我们可以直接使用php内置函数in_array()来实现判断。php in_array 函数用于检查数组中是否存在某个值,如果存在,则返回true,否则返回false。本文章向大家介绍in_array函数的基本语法及使用实例,感兴趣的朋友可以参考一下。
    2016-11-11
  • PHP URL参数获取方式的四种例子

    PHP URL参数获取方式的四种例子

    这篇文章主要介绍了PHP URL参数获取方式的四种例子,php url参数解析的4种方法,需要的朋友可以参考下
    2014-02-02
  • ThinkPHP实现简单登陆功能

    ThinkPHP实现简单登陆功能

    这篇文章主要为大家详细介绍了ThinkPHP实现简单登陆功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • PHP7.0版本备注

    PHP7.0版本备注

    这篇文章主要介绍了PHP7.0版本备注,新版本发布在性能方面大大提升,同时在语言特性方面也改变了不少,以下内容是LCT翻译对官方版本升级备注,需要的朋友可以参考下
    2015-07-07
  • dedecms中使用php语句指南

    dedecms中使用php语句指南

    dedecms是广大站长们比较喜欢也经常使用的一款文章管理系统,使用方便,今天我们来研究下dedecms中如何使用php语句,有相同需求的小伙伴们可要看仔细了。
    2014-11-11

最新评论