[原创]在数据库中进行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) |
其中$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字段的进行查询和显示。