[原创]在数据库中进行IP操作的解决方案

[原创]在数据库中进行IP操作的解决方案

适用于显示输出IP,按IP范围的查询。

一条SQL语句把数据库中以整型存储的IP格式与字符形式互换

IP,是以四个字节进行存储,为位最大FF.FF.FF.FF,点分十进制最大为255.255.255.255。我们可以理解为这是一个整型并存储在数据库中,这样可以减少点分十进制字符形式的存储的冗于,还有利于进行一个区间进行查询,数据库这样设计是个好习惯。

整型显示为点分十进制:

       我这里以PHP与MYSQL为例,其思想是:通过观查IP,发现四位每位都是256进制,这样我们这可以通过模(MOD)运算钭各位取出并加上“.”显示成点分十进制。

       我们可以写这样一个函数

  function sql_long_to_ip($colum1)
  {
          return " CONCAT(((".$colum1."-8388608)/16777216)%256,'.', ((".$colum1."-32768)/65536)%256, '.', ((".$colum1."-128)/256)%256, '.', (".$colum1.")%256) AS ".$colum1." ";
  }

              其中$colum1就是那个整型的IP存储字段

       我带看观来分析一下这个函数:

              这个函数返回一个字符串,这个字符串就是将整型IP转为点分十进制字符串显示的串。输入的参数就是整型IP的列名。使用方法如:$strSql = ‘SELECT ‘. sql_long_to_ip(‘lIP’).’FROM IP_TEST;’。再将$strSq执行,显示的就为点分十进的格式了。

 

点分十进制转为IP:

       因为数据库中是以整型来存储的,所以在查询时需要将用户输入的点分十进制转为整型。上面已经说过,每位是256进制,所以把每段进行移位或乘上2的256次方就是了.不过WEB进行这样的运算压力较大,所以可以用类似split函数将每位拆分,再转换为16进制把每位进接以0XFFFFFFFF的形式以字符形式加到sql语句中就是了。

       这里有个列子,但没有用到SPLIT函数,因为那时我没想到用这个函数:P。

// 将IP转换为数值 , 格式:0.0.0.0

function ip_to_long($ip)

{

       if (strlen($ip) > 0)

       {

              $ip_array = explode(".", $ip);;

 

              if (count($ip_array) != 4)

                     return 0;

       }

       else

       {

              return 0;

       }

 

       $start = 0;

       $len = strpos($ip, '.') - $start;

       $ip1 = trim(substr($ip, $start, $len))+0;

 

       $start += $len +1;

       $len = strpos($ip, '.',$start) - $start;

       $ip2 = trim(substr($ip, $start, $len))+0;

 

       $start += $len +1;

       $len = strpos($ip, '.',$start) - $start;

       $ip3 = trim(substr($ip, $start, $len))+0;

 

       $start += $len +1;

       $len = strlen($ip) - $start;

       $ip4 = trim(substr($ip, $start, $len))+0;

 

       $ip1 = base_convert( $ip1, 10, 16);

       $ip2 = base_convert( $ip2, 10, 16);

       $ip3 = base_convert( $ip3, 10, 16);

       $ip4 = base_convert( $ip4, 10, 16);

 

       ( strlen( $ip1)<2) ? ( $ip1 = "0".$ip1) : ( $ip1);

       ( strlen( $ip2)<2) ? ( $ip2 = "0".$ip2) : ( $ip2);

       ( strlen( $ip3)<2) ? ( $ip3 = "0".$ip3) : ( $ip3);

       ( strlen( $ip4)<2) ? ( $ip4 = "0".$ip4) : ( $ip4);

 

       return '0x'.$ip1 . $ip2 . $ip3 . $ip4;

}

就此,已经可以对整型的IP字段的进行查询和显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值