Discuz 5.0 は独自の IP データを使用しなくなりましたが、Innocence IP データベースへのアクセスは少し面倒で、具体的な形式の分析については、次の 2 つのリンクを参照してください。他の言語での実装については、記事の最後にあるリンクを参照してください。
「Innocence IP データベース形式の詳細説明」
リンク 1: http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx
リンク 2: http://lumaqq.linuxsir.org /article /qqwry_format_detail.html
Innocent IP データベース公式サイト: http://www.cz88.net/ip/
Innocent IP データベースのダウンロード: http://update.cz88.net/soft/qqwry.rar
以下の関数conrvertip() は Discuz!5_GBK/upload/include/misc.func.php パスにあります。興味があれば、詳細を読んで分析できます。(読みやすくするために以下のコードに簡単な変更を加えました。コアは変更されていません)
//================= ======== ==========
//
// 関数: 実アドレスを取得するための IP アドレス関数
// パラメータ: $ip - IP アドレス
// 著者: [ 】 (C)Comsenz Inc.
//
//================================== =
function Convertip($ip) {
/ /IP データ ファイルのパス
$dat_path = 'QQWry.Dat'
//IP アドレスを確認
if(!preg_match("/^d{1,3}.d{ 1,3}.d{1,3} .d {1,3} $/", $ IP)) {
Return 'IP Address Error';
}
// IP データ ファイルを開きます
if (! $ fd = @fopen($ dat_path、 'rb')){off off -dec 9 0] * 16777216 + $ ip [1] * 65536 + $ ip [2] * 256 + $ ip [3] * 16777216 + $ ip [1] * 16777216 + $ ip [1] * 16777216 + $ ip [1] * 16777216 + $ ip [1] * 16777216 + ;
//IP データインデックスの開始位置と終了位置を取得します
$DataBegin = fread($fd, 4);
$ipbegin = implode( 'L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32 );
$ipend ('', unpack('L', $DataEnd)); if($ipend < 0) $ipend += pow(2, 32);
$ipend - $ipbegin) / 7 + 1;
$EndNum = $ipAllNum; /バイナリ検索メソッドを使用して、インデックス レコードから一致する IP レコードを検索します
while($ip1num>$ipNum || $ip2num< $ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2); ;
$ipData1 } // 抽出データ変換 データが負の場合、32乗
$ ip1num = IMPLODE ('', unpack ('l', $ ipdata1)); ;
// 抽出されたlong整数がIPアドレスより大きい場合、次のサイクルの終了位置を変更します
//前のインデックスを取得した後、次のインデックスを取得します
}
$DataSeek = implode('' 、uppack( 'l'、$ dataseek.chr(0)));$ ip2num&lt; if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3 ; ('L', $ipSeek.chr (0)));
fseek($fd, $ipSeek); ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($ fd, 3)
if(strlen($AddrSeek) < 3) {
fclose($fd); return 'システムエラー';
$ipFlag = fread($fd, 1);
if($ ipflag == chr (2)) {
$ addrseek2 = FREAD ($ fd, 3);
IF (STRLEN ($ addrseek2) & lt; 3) {
fclose ($ fd);
'システム エラー' を返す
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr() 0)));
seek($fd, -1, SEEK_ CUR) ;
} i while (($ char = fread ($ fd, 1))! = Chr (0))
$ ipaddr2. = $ Char; $ addrseek = implice ('', unpack ('l', $ addrseekkkk .chr(0)));
fseek($fd, $AddrSeek)
while(($char = fread($fd, 1)); = chr(0))
$ipAddr1 .= $char
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
「システムエラー」を返します。
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0)){
$ipAddr2 .= $char;
}
}
fclose($fd);
//最後に相対的な代替操作を行った後に結果を返します
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipAddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
$ipaddr = preg_replace('/^s*/is', '', $ipaddr);
$ipaddr = preg_replace('/s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
$ipaddr = '不明';
}
$ipadr を返す;
}
//========================
//
// 调用举例(速度很快)
//
//== ======================
echo convertip('219.238.235.10');
//输出: 北京市 電信通
echo convertip('23.56.82.12');
//输出:IANA
echo convertip('250.69.52.0');
//输出:IANA保留地址
echo convertip('238.69.52.0');
//出力:IANA 保留地址 多点転送用
echo convertip('192.168.0.1');
//出力:局域网对方和您在同一内部网
echo convertip('255.255.255.255');
//输出:纯真网络 2006年11月20日IPデータベース
?>
以上は、真 IP データベース サービスの Discuz 50 を介して、真 IP データベース関数の分析を取得しました。これには、真 IP データベースに関する内容が含まれており、PHP 教則に関心のある友人の助けになることが望まれます。