PHP中IP地址与整型数字互相转换详解


Posted in PHP onAugust 20, 2014

IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,ip6不在本文范围内。

系统函数ip2long与long2ip
PHP中有内置函数ip2long可以将ip地址转换整型。

$ip = '210.110.11.49';

echo ip2long($ip);

输出:
-764540111

输出的整型有负号是因为我们得到的结果是有符号整型,有符号整型最大值2147483647,要把结果转换为无符号型可以这么写:
3530427185

使用long2ip把整型转换回ip地址

$ip = '210.110.11.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
210.110.11.49

-764540111

210.110.11.49

从结果可以看到,ip与整型可以通过函数完成。

系统函数小bug

这中bug网上一搜都是,大意说的是ip某段加个前导0,先来看看这个bug实例

$ip = '210.110.011.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
210.110.011.49

-764540623

210.110.9.49

转换结果不匹配,我们试着在ip第一段数字前加前导0,再看看

$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

输出:
021.110.11.49

292424497

17.110.11.49

转换结果都出错。以上例子都是因为加了前导0后导致转换结果出错,连带逆转结果与原转换ip不匹配。

转换原理

目前有两个算法:
第一、第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后总和

$ip = '0210.110.11.49';

 

function ipToInt($ip){

    $iparr = explode('.',$ip);

    $num = 0;

    for($i=0;$i<count($iparr);$i++){

        $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));

    }

    return $num;

}

 

echo  $ip.'<br />';

$ip_int = ipToInt($ip);

echo $ip_int.'<br />';

echo long2ip($ip_int);

输出:
0210.110.11.49

3530427185

210.110.11.49

第二、通过位运算符

$ip = '0210.110.11.49';

 

function ipToInt($ip){

    $iparr = explode('.',$ip);

    return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));

}

 

echo  $ip.'<br />';

$ip_int = ipToInt($ip);

echo $ip_int.'<br />';

echo long2ip($ip_int);

输出:
0210.110.11.49

-764540111

210.110.11.49

检测IP是否合法

第一、自己遍历检测

function check_ip($ip){

    $iparr = explode('.',$ip);

    foreach($iparr as $v){ if($v>255) return false; }

    return true;

}

 

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '<br />';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

[code]
输出:

[code]

210.285.11.49,bool(false)

210.205.11.49,bool(true)

第二、使用ip2long返回
function check_ip($ip){

    if(ip2long($ip)) return true;

    return false;

}

 

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '<br />';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

输出:
210.285.11.49,bool(false)

210.205.11.49,bool(true)

后记

不少人把ip写库用ip2long转换存放int类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据逆转ip时用long2ip得到的ip与原ip不符合
如果是mysql可以使用mysql系统函数INET_ATON与INET_NTOA解决,或者使用bigint类型处理,要么自己写函数。

PHP 相关文章推荐
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
php分页函数示例代码分享
Feb 24 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP中实现获取IP和地理位置类分享
Feb 10 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 PHP
PHP函数http_build_query使用详解
Aug 20 #PHP
PHP函数in_array()使用详解
Aug 20 #PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 #PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 #PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 #PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 #PHP
php实现文件下载代码分享
Aug 19 #PHP
You might like
php下使用SMTP发邮件的代码
2008/01/10 PHP
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP之数组学习
2011/05/29 PHP
php基础学习之变量的使用
2011/06/09 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python使用turtle绘制分形树
2018/06/22 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
什么是Python中的匿名函数
2020/06/02 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
入党申请自荐书范文
2014/02/11 职场文书
毕业生求职信范文
2014/06/29 职场文书
反对邪教标语
2014/06/30 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书