GeoIP函数返回0

时间:2015-09-07 14:04:15

标签: php geoip maxmind mbstring

我正致力于实施一些geoIP功能,将用户从我的.com网站重定向到相关的国家/地区域(.fr,.es,.co.uk等)。

我在index.php中检查了用户IP:

ini_set('display_errors', 1);
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

if($country_code == 'ES')
{
        header('Location: https://www.testsite.es');
}
elseif($country_code == 'GB')
{
        header('Location: https://www.testsite.co.uk');
}
elseif($country_code == 'FR')
{
        header('Location: https://www.testsite.fr');
}
else {
        header('Location: https://www.testsite.com/home');
}

当我检查$country_code变量时,它是一个空字符串,结果导致上述操作失败,我总是点击https://www.testsite.com/home ...

我开始深入研究代码并注意到我首先调用此方法:

function geoip_country_code_by_addr($gi, $addr) {

    if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
        $record = geoip_record_by_addr($gi, $addr);
        if ($record !== false) {
            return $record->country_code;
        }
    } else {
        $country_id = geoip_country_id_by_addr($gi, $addr);

        if ($country_id !== false) {
            return $gi->GEOIP_COUNTRY_CODES[$country_id];
        }
    }
    return false;
}

调用:

function geoip_country_id_by_addr($gi, $addr) {
    $ipnum = ip2long($addr);
    return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
}

我无法弄清楚为什么它会一直失败并返回' 0'?我正在使用Maxminds geoip.inc php来检查国家/地区代码。

我已经检查过我的php.ini文件中是否启用了mbstring。由于某种原因,它根据我传递给它的IP没有找到国家代码。有什么人可以帮助解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

只是想说我已经解决了这个问题。我的错误,可能是我需要休息的迹象!

在Maxmind提供的geoip.inc.php内,我最初收到了这些错误:

无法在第438行的geoip.inc中重新声明geoip_country_code_by_name()

为了解决这个问题,我只是检查方法是否已定义,如果不是,我按如下方式使用它:

if (!function_exists('geoip_country_code_by_name')) {
    function geoip_country_code_by_name($gi, $name) {
        $country_id = geoip_country_id_by_name($gi, $name);
        if ($country_id !== false) {
            return $gi->GEOIP_COUNTRY_CODES[$country_id];
        }
        return false;
    }
}

我遗憾地在上面的代码中出现了一个小错字,导致代码无法正常执行,因此每次都会返回0。