【问题标题】:GeoIP function returning 0GeoIP 函数返回 0
【发布时间】:2015-12-03 02:54:14
【问题描述】:

我正在努力实现一些 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 来检查国家代码。

我已经检查了mbstring 在我的 php.ini 文件中已启用,并且确实如此。出于某种原因,它只是找不到基于我传递给它的 IP 的国家代码。有人对可能导致这种情况的原因有任何帮助吗?

【问题讨论】:

  • 并非每个 IP 地址都与一个位置相关联(任何 geoip 服务返回的位置充其量只是一个有根据的猜测)。您传入的所有地址都发生这种情况吗?
  • 是的每一个,我什至尝试过使用我自己的 IP 地址,当我使用 php geo IP 和 PECL 时,我知道它在过去有效。当然你可能会说我为什么不直接使用这种方式,但不幸的是我无法走这条路。

标签: php geoip maxmind mbstring


【解决方案1】:

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

在 Maxmind 提供的 geoip.inc.php 中,我最初收到以下错误:

无法在 geoip.inc 第 438 行重新声明 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。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多