Mar 17

首先我们要说些题外话,如果您能利用微软的IP定位接口,当然是最好的选择..但是由于我利用此接口的时候总是显示我的IP无法定位!所以我才换用了geoip的JS接口!
当然,您还可以选择在自己的服务器上上传一个数据库,这样的好处是调用不受网络限制,但缺点也显而易见,就是IP不全.

OK,首先让我们了解一下微软的IP定位接口…
相应说明可以参考微软的官方网站说明,见http://msdn2.microsoft.com/en-us/library/aa907670.aspx
下面具体说一下该接口:
在浏览器中输入:http://maps.live.com/WiFiPService/locate.aspx
非正常情况下应该显示类似信息(我没有测试成功过,所以不知道正常应该如何显示):AutoLocateUndetectable(”%1 cannot determine your current location. Try again later.”);

OK,我懒得写那么多东西了..仅仅是将源代码发布如下!里边的注释很清楚了,有兴趣的同学自己研究!如果您对PHP,数据库,API以及JS一无所知…劝您别下了!白费劲..虽然我这些代码已经简单的不能再简单了,但是并不是文盲看的明白的!对使用此文件所产生的一切后果概不负责,本人仅在此保证肯定不含任何病毒以及有害代码!本示例仅供研究使用,请多多转载,但如请注明出处..并且,本示例不允许应用于商业使用!

压缩包内可能含有一个error.log..由于我是直接从自己服务器上down下来的,所以存在这个文件,对您无用!可以直接删除..一起上传也仅仅是给别人研究的时候多一个依据!
数据库上您需要建立一个单独的数据库,名字可以随便写,但是您需要修改PHP中的相关代码,将guestmap修改成您对应的数据库名称,并上传guestmap.sql,又或者您可以自己在数据库中添加相应的表.

使用前请先下载http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz,并解压缩到你的目录中!

另外强调一点,本实例不完全,并且我解决不了.在测试中我发现,有些IP地址不能正确读写.并且伴随data.php的js读取错误!本来我以为已经解决,后发现并非如此..如果您能解决,请留言或mail告诉我症结..
本人mail:hivan[dot]doo[at]gamil[dot]com

PS:更改源代码的时候推荐使用Notepad++
效果参见:http://blog.ivandoo.com/2008/fangke-ip-gion.html
后续参见:http://blog.ivandoo.com/2008/ditu.google.com.html
源代码下载地址:

written by doo \\ tags: , , , ,

Feb 27

写了一篇近期问题.
主要是探究为什么在我Google map上的IP地址呈现127.255.255.255状态!

开始我以为是geoip的解析问题,我错了….大错特错!

登录后台数据库可以看到最近的几个用户访问的时候依然有IP地址的变化@那就是说并不是我这边的php出错,而是JS的问题..数据库依然可以接受数据.而且依然有变化@但是更多的是呈现错误的IP地址.

我想,这大概是由于geoip的js不能完全解析中国的IP地址,所以造成了这样的原因..最有力的说明就是今天访问的用户60.18.23.92(辽宁抚顺)的IP地址就是正常的.而在北美地区的所有用户IP地址都可以正常呈现!

看来geoip的ip数据库还是不够全啊!..但是我暂时又找不到其他的可以使用的远程js~先这么凑合着吧!

written by doo \\ tags: , , , , , ,

Feb 27

相信大家也都看到了,我右上角的地图显示的地标里IP地址不正确显示了.
现在这种情况的原因不太清楚,但是估计是geoipregionvars.php不能正确解析的原因..

幸亏我用的是远程js解析后直接获取,所以地址显示并不受影响.

等有时间了再来查查原因吧,由于现在是不稳定的阶段,很多时候我自己都找不到原因,所以源代码暂时就不放出来了!

written by doo \\ tags: , , ,

Feb 26

出错历史:
我编写的代码从来没有顺利的执行过,可是由于本地环境和主机环境不一样,所以有的时候在本地测试合格放到主机上则不行,而有的时候则相反..
这次是一段函数出错了,错误提示:

Warning :  Cannot  modify  header  information  -  headers  already  sent  by  (output   started   at   xxx.php:32)  in  xxx.php on  line 34

我询问了花儿zhiqiang,前者给我的答复如下:

xxx.php,把文件开头的空格全都去掉,如果是 UTF-8 格式保证文件头部没有 BOM。
如果不是这个原因,就要检查你的代码,在调用 header 命令之前,不要有任何输出。

我开始在所有的php页头查找bom,无果..后来用UltraEdit32(默认我是用Notepad++)从新全部保存了一遍无BOM格式.上传后问题依旧.没有办法,我建立了一个”del_bom.php”,代码如下:

下载: del_bom.php
<?php
$basedir        = "."; //修改此行為需要檢測的目錄,點表示當前目錄
$auto                = 1; //是否自動移除發現的BOM信息。1為是,0為否。
 
//以下不用改动
 
if ($dh = opendir($basedir))
{
        
while (($file = readdir($dh)) !== false)
        
{
                
if ($file != '.' && $file != '..' && !is_dir($basedir . "/" . $file))
                        
echo "filename: $file " . checkbom("$basedir/$file") . "<br>";
        
}
        
closedir($dh);
}
 
function checkbom ($filename) {
        
global $auto;
        
$contents                = file_get_contents($filename);
        
$charset[1]        = substr($contents, 0, 1);
        
$charset[2]        = substr($contents, 1, 1);
        
$charset[3]        = substr($contents, 2, 1);
        
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191)
        
{
                
if ($auto == 1)
                
{
                        
$rest        =        substr($contents, 3);
                        
rewrite ($filename, $rest);
                        
return ("BOM found, automatically removed.");
                
}
                
else
                
{
                        
return ("BOM found.");
                
}
        
}
        
else return ("BOM Not Found.");
}
 
function rewrite ($filename, $data)
{
        
$filenum        = fopen($filename, "w");
        
flock($filenum, LOCK_EX);
        
fwrite($filenum, $data);
        
fclose($filenum);
}
?>

运行后还是不行,我想应该不是BOM的问题..我仔细看了一遍提示出错的XXX.php…发现提示的错误行代码我是这样写的:

下载: XXX.php
//执行SQL语句
    
if(mysql_query($sql))
    
{
      
echo 'var recorded = true; alert($ip);';
      
//设定Cookie值,设置1天后失效
      
setcookie("visited", true, time()+3600*24);
    
}
    
else  //插入失败
    
{
      
echo 'var recorded = false; alert($ip);';
      
//设定Cookie值,失效时间为过去,即删除该Cookie
      
setcookie("visited", false, time()-3600*24);
    
}

花儿给我的提示是:在调用 header 命令之前,不要有任何输出
我想起PHP中stecookie前世不能echo的..但是无法,这段代码是必须的,我在CSDN上询问,专家给出解决办法,修改如下:

下载: xxx.php
//执行SQL语句
    
if(mysql_query($sql))
    
{
      
//设定Cookie值,设置1天后失效
      
setcookie("visited", true, time()+3600*24);
    
echo 'var recorded = true; alert($ip);';
    
}
    
else  //插入失败
    
{
      
//设定Cookie值,失效时间为过去,即删除该Cookie
      
setcookie("visited", false, time()-3600*24);
      
echo 'var recorded = false; alert($ip);';
    
}

这段代码我之前也测试过,不行,错误提示:找不到$ip
无奈,我又询问了花儿解决办法.答复如下:

用 ob_start() ob_flush() 这套函数吧

正当我修改代码后要上传的时候,发现错误提示不见了.并且数据库中出现了点变化.
以前我用同一页面强制刷新后数据库中会增加一条记录,而现在不会了.我再用其他浏览器登录,数据库中又会增加一条数据.
那就是说说cookie的设置生效了.
到这里事件结束,可是我有点摸不着头脑为何..代码依然还是以前的代码…
等我查阅相关资料后补充这篇post.

在此感谢花儿

PS:后来又断断续续出现此问题,没有办法,加上了ob_start(); 代码..问题不在出现了…

written by doo \\ tags: , ,

Feb 25

Google maps API来完成访客的地标自动加注已经完成了..中间遇到了一点小的问题..原来是在编写的时候忘记将geoip提供的js地址加上去.开始一直以为是数据库出问题了.

过段时间慢慢的写教程并且将源代码交代出来..

在此感谢”塞蛋进去”,”敏娃子“,”菲菲“,”布布“,”猪头星“,”胖子”以及其他给予我帮助的人..谢谢他们帮我做的测试!

written by doo \\ tags: , , , , ,