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

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


咨詢
建站咨詢
