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

echo ip2long("10.2.1.3");

?>

我们将得到

167903491

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

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;

}

?>

其二,用位运算

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是否是有效的,如

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函数仍能得到正确的结果.

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

原文链接:https://www.cnblogs.com/ghjbk/p/6957155.html

php ip2long mysql,PHP基于ip2long实现IP转换整形相关推荐

  1. php ip2long bug,PHP代码ip2long 循环有关问题

    PHP代码ip2long 循环问题 print_r($dataIp); foreach ($dataIp as $key=>$value) { $data['ip']     =   $valu ...

  2. mysql服务器是否支持tcp/ip连接,(3)MySQL客户端与服务端的TCP/IP及socket连接方式-Go语言中文社区...

    MySQL客户端与服务端的TCP/IP及socket连接方式 客户端与服务器模型 客户端与服务端模型 TCP/IP方式连接 解释说明 TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也 ...

  3. PXE安装Centos65 postfix+exmail+mysql实现基于 虚拟用户的web邮件系统

    PXE安装Centos postfix+exmail+mysql实现基于 虚拟用户的web邮件系统 在实现centos+postfix的web内网邮件之前,参考了许多网上.书本知识,经过两次大的改动, ...

  4. 解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)

    解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本) 参考文章: (1)解决使用Navicat等工具进行连接登录mysql的1130错 ...

  5. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(五)客户端介绍

    开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(二)基础类库介绍 开源倾情奉献:基于.NET打造I ...

  6. mysql计算秒_如何在MySQL中基于秒计算时间?

    让我们首先创建一个表-mysql> create table DemoTable ( Logouttime time ); 使用插入命令在表中插入一些记录-mysql> insert in ...

  7. php基于新浪ip库获取城市,PHP基于新浪IP库获取IP详细地址的方法

    [导读]这篇文章主要介绍了PHP基于新浪IP库获取IP详细地址的方法,涉及php正则.curl及编码转换相关操作技巧 本文实例讲述了PHP基于新浪IP库获取IP详细地址的方法.代码如下<?php ...

  8. MySQL 连接报错:mysql access denied for user@ip

    故障描述: 在VM中有MySQL,但是在PC中通过Navicat连接时,报如下错误: m1045 - mysql access denied for 'root'@IP 解决方法: 执行如下命令: G ...

  9. 无法用ip连接mysql数据库_MYSQL数据库无法使用IP访问的方法

    MYSQL数据库无法使用IP访问的方法 Windows下面首先要保证防火墙例外中含有mysql的端口如3306 PHP+mysql的时候发现连接数据库只能使用localhost,但是使用IP就不能连接 ...

最新文章

  1. token 的设计方案
  2. 项目经理应该知道的97件事 --译者序
  3. 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)
  4. Reactive Extensions入门(5):ReactiveUI MVVM框架
  5. lvs为何不能完全替代DNS轮询--转
  6. 拦截锚点修改url_浅谈URL跳转与Webview安全
  7. /var/lib/mlocate/mlocate.db
  8. 大数据互联网架构阶段 数据库三范式与反范式
  9. lfw2019_来自 LFW SS20 你应该知道的5个时尚趋势
  10. 我的世界服务器物品展示框,我的世界怎么展示框物品 展示框攻略
  11. Spring中使用@Async注解使Even监听事件之间的执行变为异步
  12. switch错误码2016-0247 无法识别SD卡解决方案(猴子也能看懂的简单命令行操作,无需格式化!)
  13. 电磁流量计精度等级和功能
  14. matlab中grid相关知识
  15. matlab 二值图像黑白颠倒,白天不懂夜的黑,为你开启PS黑白颠倒魔法。
  16. 年轻人转行需三思,未来5-10年什么工作真吃香?
  17. [转]移动IIS7.5默认inetpub目录_se7en3_新浪博客
  18. Java 多个pdf合并成一个pdf
  19. 常规计算机 符号键是,有谁知道电脑键盘上的标示符号都代表什么意思
  20. meta camp+21春季PAT乙级反思

热门文章

  1. 固定 顶部_一楼小院想建阳光房?固定的怕违建,那这样可伸缩的阳光房怎么样...
  2. Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
  3. antd 设置表头属性_使用表数据自定义React Antd表头
  4. 迭代器 java_百战程序员:Java设计模式之迭代器模式
  5. html九宫格抽奖视频,原生JS实现九宫格抽奖效果
  6. 调用ice服务器_Nodejs+socket.io搭建WebRTC信令服务器
  7. #和##在宏替换中的作用
  8. android踩坑日记1
  9. 使用缓存的9大误区(上)(转)
  10. 发一则自己创作的Lae程序员小漫画,仅供一乐