新聞中心
隨著互聯(lián)網的發(fā)展和深入,越來越多的網站和應用程序需要獲取用戶所在地的信息,以便提供更精準的服務。而獲取用戶所在地信息中,城市信息是其中不可或缺的一部分。而純真數據庫則是一個權威的IP地址歸屬地查詢數據庫,其中包含了全國各個城市的信息。本文將介紹的方法。

一、準備工作
在之前,需要進行一些準備工作。首先需要下載并解壓縮純真數據庫的文件。純真數據庫文件可以從純真官網或者第三方網站中獲取,其中包括 qqwry.dat , location.dat 等文件。在下載完成后,我們需要將這些文件上傳至服務器的指定目錄中。例如將這些文件放在 /usr/local/qqwry 目錄下。
二、連接純真數據庫
在獲取純真數據庫中的城市信息之前,我們需要先連接到純真數據庫中。在 PHP 中使用數據庫的函數,需要依賴 PHP 的擴展庫。在連接純真數據庫時,要用到 PHP 的 fread 函數讀取數據,所以需要在更改 php.ini 文件中的 file_uploads 配置項為 On, 否則讀取數據時將出現錯誤。連接純真數據庫的代碼如下:
“`
// 純真數據庫文件路徑
define(‘QQWRY_PATH’, ‘/usr/local/qqwry/qqwry.dat’);
// 連接純真數據庫
function connectQQWry() {
// 打開純真數據庫文件
$fp = fopen(QQWRY_PATH, ‘rb’);
// 判斷純真數據庫 文件是否打開成功
if($fp === false) {
return false;
}
// 讀取文件前8個字節(jié),獲取文件頭信息
$header = fread($fp, 8);
// 判斷純真數據庫是否正確
if(strlen($header) != 8 || $header[0] != chr(255) || $header[1] != chr(255) || $header[2] != chr(255) || $header[3] != chr(255)) {
fclose($fp);
return false;
}
// 讀取文件索引起始位置和結束位置
$begin = unpack(‘L’, $header[4].$header[5].$header[6].chr(0))[1];
$end = unpack(‘L’, $header[4].$header[5].$header[6].chr(0))[1];
// 返回純真數據庫的文件指針和開始,結束位置信息
return [
‘fp’ => $fp,
‘begin’ => $begin,
‘end’ => $end
];
}
“`
通過 connectQQWry 函數,我們可以連接至純真數據庫并獲取到起始位置和結束位置的信息。在執(zhí)行這個函數時可以得到 $fp、$begin 以及 $end 三個值:
– $fp:純真數據庫文件指針。
– $begin:純真數據庫索引信息起始位置。
– $end:純真數據庫索引信息結束位置。
三、查詢所在城市信息
在連接至純真數據庫并獲取索引信息后,我們就可以查詢所在城市了。查詢所在城市的方法如下:
“`
// 查詢IP地址所在城市信息
function queryCity($ip) {
// 獲取全國省市信息
$provinces = getProvinces();
// 把IP地址轉換為二進制數
$ip = pack(‘N’, intval(ip2long($ip)));
// 連接至純真數據庫
$qqwry = connectQQWry();
if ($qqwry === false) {
return false;
}
// 獲取索引信息的起始和結束位置
$begin = $qqwry[‘begin’];
$end = $qqwry[‘end’];
// 查找索引信息
while($begin
// 計算索引的中間位置
$middle = floor(($begin + $end) / 2);
// 移動文件指針到當前索引位置
fseek($qqwry[‘fp’], $middle * 7);
// 讀取當前索引的起始位置和結束位置信息
$data = fread($qqwry[‘fp’], 7);
// 判斷當前 IP 是否在當前索引范圍內
if($ip
$end = $middle – 1;
} else {
// 將指針移動到下一個索引范圍
fseek($qqwry[‘fp’], unpack(‘L’, substr($data, 4))[1]);
$begin = $middle + 1;
}
}
// 找到目標IP索引信息位置
$pos = unpack(‘L’, fread($qqwry[‘fp’], 4))[1];
// 讀取目標IP索引信息
fseek($qqwry[‘fp’], $pos);
$data = fread($qqwry[‘fp’], 4);
// 判斷是否存在重定向信息
if($data[0] == chr(1)) {
$pos = unpack(‘L’, substr($data, 1))[1];
fseek($qqwry[‘fp’], $pos);
$data = fread($qqwry[‘fp’], 4);
}
// 判斷是否存在詳細地址信息
if($data[0] == chr(2)) {
$addr = unpack(‘L’, fread($qqwry[‘fp’], 3).chr(0))[1];
$length = unpack(‘C’, fread($qqwry[‘fp’], 1))[1];
$addrstr = fread($qqwry[‘fp’], $length);
} else {
$addrpos = $pos + 4;
$addrstr = ”;
while(($word = fread($qqwry[‘fp’], 2)) != “\0\0”) {
$addrpos += 2;
$addrstr .= $word;
}
}
// 關閉文件并返回查詢結果
fclose($qqwry[‘fp’]);
// 分析地址信息
$cityInfo = [
‘province’ => ”,
‘city’ => ”,
‘district’ => ”,
];
if($addrstr != ”) {
$cityInfo = yzeAddress($addrstr, $provinces);
}
return $cityInfo;
}
“`
通過這個函數,我們可以傳入一個 IP 地址并獲取其所在的省市區(qū)信息。
四、分析省市區(qū)信息
我們需要對查詢到的地址信息進行分析,獲取到其對應的省市區(qū)信息。分析函數如下:
“`
// 分析詳細地址信息
function yzeAddress($addrstr, $provinces) {
$cityInfo = [
‘province’ => ”,
‘city’ => ”,
‘district’ => ”,
];
$addrArr = explode(chr(0), $addrstr);
foreach($addrArr as $addr) {
if(mb_strpos($addr, ‘省’) !== false || mb_strpos($addr, ‘市’) !== false) {
if(mb_strpos($addr, ‘市’) !== false) {
$cityInfo[‘province’] = mb_substr($addr, 0, mb_strpos($addr, ‘市’) + 1, ‘UTF-8’);
} else {
$cityInfo[‘province’] = $addr;
}
} else {
$cityInfo[‘city’] = $addr;
foreach($provinces as $province) {
if(mb_strpos($cityInfo[‘province’], $province) !== false) {
$cityInfo[‘province’] = $province;
break;
}
}
}
}
return $cityInfo;
}
“`
分析函數將傳入的地址信息進行分割,獲取其中的省、市、區(qū)信息,并通過比對全國省市信息進行修正。通過這個函數,我們就可以將純真數據庫中獲取到的地址信息轉換成為易于閱讀和理解的省市區(qū)信息。
五、使用
使用上述的三個函數,我們就可以輕松地在 PHP 中獲取純真數據庫中的城市信息了。使用方法如下:
“`
$ip = ‘127.0.0.1’;
$cityInfo = queryCity($ip);
print_r($cityInfo);
“`
以上代碼中,我們可以將 $ip 變量替換為需要查詢城市信息的 IP 地址即可。
六、
通過本文的介紹,我們了解了如何。在實際開發(fā)中,我們可以使用這個功能來獲取用戶所在地信息,為用戶提供更加精準的服務。當然,在使用純真數據庫時需要注意其數據的實時性和準確性。在使用時,建議定期更新純真數據庫文件,以保證數據的有效性。
相關問題拓展閱讀:
- 如何用php獲取數據庫信息并顯示
如何用php獲取數據庫信息并顯示
獲取ppq數據庫的所有表名的代碼:
?php
$server=’localhost’;
$user=’root’;
$pass=’12345′;
$dbname=’ppq’;
$conn=mysql_connect($server,$user,$pass);
if(!$conn)
die(“數據庫系統(tǒng)連接失?。 ?;
$result=mysql_list_tables($dbname);
if(!$result)
die(“數據庫連接失?。 ?;
while($row=mysql_fetch_row($result))
{
echo
$row.”態(tài)蘆
“;
}
mysql_free_result($result);
?
mysql_list_tables
(PHP
3,
PHP
,
PHP
5)
mysql_list_tables
—
列出
MySQL
數據庫中的表
說明
resource
mysql_list_tables
(
string
database
resource
link_identifier>)
mysql_list_tables()
接受一個數據庫名并返回和
mysql_query()
函數很相似的一顫羨個茄閉拍結果指針。用
mysql_fetch_array()或者用mysql_fetch_row()來獲得一個數組,數組的第0列就是數組名,當獲取不到時
mysql_fetch_array()或者用mysql_fetch_row()返回
關于純真數據庫獲取城市 php的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網站建設、網站維護、網站改版的網站建設公司,提供成都網站制作、成都網站建設、成都網站推廣、成都網站優(yōu)化seo、響應式移動網站開發(fā)制作等網站服務。
文章名稱:使用PHP獲取純真數據庫中的城市信息(純真數據庫獲取城市php)
網頁URL:http://www.5511xx.com/article/dphjgic.html


咨詢
建站咨詢
