本站所有内容仅限用于学习和研究目的,如有侵权请邮件与我们联系处理!
世上事本无难易,为之则易!

网站首页 站群教程 原创站群教程 正文

PHP使用纯真IP数据库输出ip位置

曹操 2023-05-11 原创站群教程 921 ℃ 3 评论 9236字 free 收藏

在进行网站访问统计时,我们通常需要获取访客的IP地址和地理位置信息。然而,手动查询每个访客的地理位置会十分麻烦。

因此,本文介绍了一种简便的方法:使用纯真IP数据库查看访客地理位置的PHP代码。这种方法可以通过IP地址查询出访客所在的地理位置,避免了手动查询的繁琐和不可靠。具体代码如下:

function convertip($ip) {
  $ip1num = 0;
  $ip2num = 0;
  $ipAddr1 ="";
  $ipAddr2 ="";
  $dat_path = './ip.dat';        //纯真数据库文件位置
  if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
    return 'IP Address Error';
  }
  if(!$fd = @fopen($dat_path, 'rb')){
    return 'IP date file not exists or access denied';
  }
  $ip = explode('.', $ip);
  $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  $DataBegin = fread($fd, 4);
  $DataEnd = fread($fd, 4);
  $ipbegin = implode('', unpack('L', $DataBegin));
  if($ipbegin < 0) $ipbegin += pow(2, 32);
    $ipend = implode('', unpack('L', $DataEnd));
  if($ipend < 0) $ipend += pow(2, 32);
    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  $BeginNum = 0;
  $EndNum = $ipAllNum;
  while($ip1num>$ipNum || $ip2num<$ipNum) {
    $Middle= intval(($EndNum + $BeginNum) / 2);
    fseek($fd, $ipbegin + 7 * $Middle);
    $ipData1 = fread($fd, 4);
    if(strlen($ipData1) < 4) {
      fclose($fd);
      return 'System Error';
    }
    $ip1num = implode('', unpack('L', $ipData1));
    if($ip1num < 0) $ip1num += pow(2, 32); 
 
    if($ip1num > $ipNum) {
      $EndNum = $Middle;
      continue;
    }
    $DataSeek = fread($fd, 3);
    if(strlen($DataSeek) < 3) {
      fclose($fd);
      return 'System Error';
    }
    $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
    fseek($fd, $DataSeek);
    $ipData2 = fread($fd, 4);
    if(strlen($ipData2) < 4) {
      fclose($fd);
      return 'System Error';
    }
    $ip2num = implode('', unpack('L', $ipData2));
    if($ip2num < 0) $ip2num += pow(2, 32);
      if($ip2num < $ipNum) {
        if($Middle == $BeginNum) {
          fclose($fd);
          return 'Unknown';
        }
        $BeginNum = $Middle;
      }
    }
    $ipFlag = fread($fd, 1);
    if($ipFlag == chr(1)) {
      $ipSeek = fread($fd, 3);
      if(strlen($ipSeek) < 3) {
        fclose($fd);
        return 'System Error';
      }
      $ipSeek = implode('', unpack('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 'System Error';
    }
    $ipFlag = fread($fd, 1);
    if($ipFlag == chr(2)) {
      $AddrSeek2 = fread($fd, 3);
      if(strlen($AddrSeek2) < 3) {
        fclose($fd);
        return 'System Error';
      }
      $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;
    $AddrSeek = implode('', unpack('L', $AddrSeek.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);
        return 'System Error';
      }
      $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 = 'Unknown';
  }
  return $ipaddr;
}

调用方式如下:

#函数调用
echo convertip('127.0.0.1');

在实现上,可以使用PHP内置的`mb_convert_encoding`函数将GBK编码的文本转换为UTF-8编码,并结合纯真IP数据库进行查询。

$location =  convertip('127.0.0.1');
$location = mb_convert_encoding($location, 'UTF-8', 'GBK');//文本由GBK转UTF-8

当然,在使用纯真IP数据库时,也需要注意一些编码和特殊字符等问题,以保证查询结果的准确性。总之,这篇文章提供了一种便捷的方法来获取访客的地理位置信息,对于进行网站访问统计和用户分析等工作都有很大帮助。

下面分享上述php代码内使用到的纯真ip数据(分享链接来源于网络)

下载链接

下载仅供技术交流、学习探讨,请勿用于非法用途!请在下载后24小时内删除!

发文不易,评论后可获取资源,请不要发布恶意评论、灌水评论,违者封号!

隐藏内容
评论可见
前往评论


Tags:数据库

必看说明

  • 本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。
  • 本站文章或仅为文本内容原创,非程序原创。如有侵权、不妥之处,请联系站长第一时间删除。敬请谅解!
  • 本站所有内容严格遵守国家法律的条例,所有研究的算法技术均来源于搜索引擎公开默认允许用户研究使用的接口。
  • 阅读本文及获取资源前,请确保您已充分阅读并理解《访问曹操SEO网站需知:行为准则》。
  • 本站分享的任何工具、程序仅供学习参考编写架构,仅可在本地的虚拟机内断网测试,严禁联网运行或上传搭建!
  • 任何资源必须在下载后24个小时内,从电脑中彻底删除。不得传播或者用于其他任何用途!否则一切后果用户自负!
  • 转载请注明 : 文章转载自  站群程序 PHP使用纯真IP数据库输出ip位置
  • 本文标题:《PHP使用纯真IP数据库输出ip位置》
  • 本文链接:http://www.zqcx.cn/1986.html

已有3位网友发表了看法:

  • 访客

    访客  评论于 [2023-11-05 12:14:51]  回复

    日常冒泡

  • 小熊猫

    小熊猫  评论于 [2023-05-16 21:52:05]  回复

    牛逼带带弟弟

  • 访客1

    访客1  评论于 [2023-05-11 19:27:45]  回复

    下载链接

欢迎 发表评论:

网站分类
近期评论
文章归档
标签列表
站点信息
  • 文章总数:2025
  • 页面总数:7
  • 分类总数:46
  • 标签总数:339
  • 评论总数:9366
  • 浏览总数:5898972