日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php ip2long mysql,PHP基于ip2long实现IP转换整形

發布時間:2025/3/15 数据库 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php ip2long mysql,PHP基于ip2long实现IP转换整形 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何將四個字段以點分開的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转换整形的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。