1. 程式人生 > >mysql 存取ip方法

mysql 存取ip方法

數字轉換 str nbsp each gb2 ever gin clas insert

一,mysql的inet_aton:ip->num,inet_ntoa:number->ip.

1,創建表

CREATE TABLE iplog (
ip int(10) unsigned DEFAULT NULL,
name char(10) DEFAULT NULL
)

2,插入ip

insert into iplog values(inet_aton(10.0.0.1),‘nwip‘);

3,取ip

select inet_ntoa(ip) from iplog ;

select * from iplog where ip = inet_aton(‘10.0.0.1‘) ;

二,php

ip2long()

log2ip()

三,原創方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>第一php網提供的教程--PHP實現IP--數字互相轉換</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<?php
/* * 作者:XXXX */ //將IP轉換為數字 function ipton($ip) { $ip_arr=explode(‘.‘,$ip);//分隔ip段 foreach ($ip_arr as $value) { $iphex=dechex($value);//將每段ip轉換成16進制 if(strlen($iphex)<2)//255的16進制表示是ff,所以每段ip的16進制長度不會超過2 { $iphex=‘0‘.$iphex;//如果轉換後的16進制數長度小於2,在其前面加一個0 //沒有長度為2,且第一位是0的16進制表示,這是為了在將數字轉換成ip時,好處理
} $ipstr.=$iphex;//將四段IP的16進制數連接起來,得到一個16進制字符串,長度為8 } return hexdec($ipstr);//將16進制字符串轉換成10進制,得到ip的數字表示 } //將數字轉換為IP,進行上面函數的逆向過程 function ntoip($n) { $iphex=dechex($n);//將10進制數字轉換成16進制 $len=strlen($iphex);//得到16進制字符串的長度 if(strlen($iphex)<8) { $iphex=‘0‘.$iphex;//如果長度小於8,在最前面加0 $len=strlen($iphex); //重新得到16進制字符串的長度 } //這是因為ipton函數得到的16進制字符串,如果第一位為0,在轉換成數字後,是不會顯示的 //所以,如果長度小於8,肯定要把第一位的0加上去 //為什麽一定是第一位的0呢,因為在ipton函數中,後面各段加的‘0‘都在中間,轉換成數字後,不會消失 for($i=0,$j=0;$j<$len;$i=$i+1,$j=$j+2) {//循環截取16進制字符串,每次截取2個長度 $ippart=substr($iphex,$j,2);//得到每段IP所對應的16進制數 $fipart=substr($ippart,0,1);//截取16進制數的第一位 if($fipart==‘0‘) {//如果第一位為0,說明原數只有1位 $ippart=substr($ippart,1,1);//將0截取掉 } $ip[]=hexdec($ippart);//將每段16進制數轉換成對應的10進制數,即IP各段的值 } $ip = array_reverse($ip); return implode(‘.‘, $ip);//連接各段,返回原IP值 } echo ipton(‘119.255.31.226‘); echo ‘<br>‘; $num=‘379374783‘; echo strlen($num).‘<br/>‘; echo ntoip($num).‘<br/>‘; echo ‘trueipnum:‘.ip2long(‘119.255.31.226‘).‘<br/>‘; echo ‘trueip:‘.long2ip(‘3793747831‘); ?> </body> </html>
我們用一個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函數仍能得到正確的結果.
感謝原創作者

mysql 存取ip方法