小魔女 发表于 2015-2-3 23:39:36

PHP教程之PHP转换IP地址到真实地址

刚开始觉得自己对这些多少有些基础,很简单,但是看了老师那么熟练的进行网页布局的时候,突然之间发现,其实,我的基础并没有自己想像的那么好,自己设计的页面其实并不好看,就连表格的边框为1像素都不会弄。   生在红旗下长在春风里,临时浸泡在河蟹社会外面所以一朝一夕就有了一些河蟹的思惟体例,正好有一段工夫在做一个.NET的网站会见统计体系,特地想着怎样“监督”下每个留言的博主们的地点地,因而就有了现在下图所示的依据获得到的留言者的IP地址失掉留言者地点的区域,固然并没有河蟹社会监督国民大众的意思,纯属懂得一下列位博主地点的真实地址,万一是个美男博主不就能够让我有线索可循。

  想要把IPv4地址转为真实的地址,一定要参考IP数据库,贸易的IP数据库存储在关系型数据库中,查询和利用都十分便利,然而本钱不是团体和小公司情愿接受的,所以复杂使用的思绪就是使用一些收费的IP数据库或一些大网站供应的查询API,他们的数据量足够咱们利用了。
  1. 使用纯挚IP数据库
  使用当地的QQWry.Dat文件(搜刮下载一个QQWry.Dat 文件放到你的wordpress主题根目次下),长处是查询速度十分快,弱点是数据库文件要放在本人的空间内而且要偶然更新数据库。工夫关系空话不多说,上面是利用这个文件的函数,假如是在WordPress外面利用这个功效,把上面的代码写入主题上面的functions.php外面,然后在comments-list的输入<?php echo convertip(get_comment_author_ip()); ?>便可。仅办理员可见话,则挪用代码<?php if ( is_user_logged_in() ) echo convertip(get_comment_author_ip()); ?>便可。假如是其他法式援用,输出一个无效的IPv4地址就能够失掉一个真实的地址。
以下为援用的内容:

function convertip($ip) {
    $dat_path = TEMPLATEPATH."/QQWry.Dat";
    if(!$fd = @fopen($dat_path, "rb")){
        return "IP date file not exists or access denied";
    }
    $ip = explode(".", $ip);
    $ipNum = $ip * 16777216 + $ip * 65536 + $ip * 256 + $ip;
    $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";
    }
    $ipaddr = iconv("gbk", "utf-8//IGNORE", $ipaddr);
    if( $ipaddr != "  " )
        return $ipaddr;
    else
        $ipaddr = "地址未知!火星来客?";
        return $ipaddr;
}
讲了这么多,无非是想说:学习PHP不仅要掌握方法,更多的是付出汗水,我不希望看到中途放弃的人,相信自己,相信自己的选择,更要相信自己的能力,如果自己想放弃,暴力一点的话,就自己抽自己一个嘴巴。

若天明 发表于 2015-2-4 05:01:06

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

小妖女 发表于 2015-2-9 16:01:59

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

飘灵儿 发表于 2015-2-11 02:52:53

写的比较杂,因为我也是个新手,不当至于大家多多指正。

因胸联盟 发表于 2015-2-14 02:12:52

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

再现理想 发表于 2015-3-4 04:03:25

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

小女巫 发表于 2015-3-4 19:33:44

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

分手快乐 发表于 2015-3-6 18:04:53

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

灵魂腐蚀 发表于 2015-3-13 04:55:34

为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。

再见西城 发表于 2015-3-20 13:12:50

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

若相依 发表于 2015-3-22 01:43:03

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

海妖 发表于 2015-3-27 15:10:02

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

柔情似水 发表于 2015-3-30 20:24:23

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

兰色精灵 发表于 2015-4-10 04:50:58

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

飘飘悠悠 发表于 2015-4-12 21:16:17

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

精灵巫婆 发表于 2015-4-12 23:47:20

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

冷月葬花魂 发表于 2015-4-24 06:16:44

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

爱飞 发表于 2015-4-29 16:55:14

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

透明 发表于 2015-5-3 02:46:48

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

深爱那片海 发表于 2015-5-6 20:09:27

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
页: [1] 2
查看完整版本: PHP教程之PHP转换IP地址到真实地址