在CodeIgniter中使用maxmid GeoIP2 PHP API

时间:2014-06-21 20:09:04

标签: php codeigniter geolocation codeigniter-2 maxmind

我正在尝试在CodeIgniter中使用GeoIP2 PHP API(https://github.com/maxmind/GeoIP2-php)。如何加载GeoIP2并将其用于用户地理位置?

我试过像这样加载它:

$this->load->library("GeoIp2/Database/Reader");

    require APPPATH . "libraries/GeoIp2/ProviderInterface.php";
    require APPPATH . "libraries/GeoIp2/Database/Reader.php";

$this->load->file("GeoIp2/ProviderInterface");
$this->load->library("GeoIp2/Database/Reader");

我收到此错误:"无法加载请求的文件:ProviderInterface"

我看过这个Namespace in PHP CodeIgniter Framework,但我对名称空间的经验不多。

没有成功,我没有获胜,我真的不知道如何在CodeIgniter中实现它。

3 个答案:

答案 0 :(得分:1)

我试图找到这个问题的解决方案。但无法在stackoverflow上找到。我在这里写自己的代码。也许,这会对某人有所帮助。我在utility_helper.php文件中添加了一个新函数:

function get_ip_country_code($ip_address) {

  require APPPATH .'third_party/GeoIP2/autoload.php';
  $reader = new GeoIp2\Database\Reader(FCPATH.'public/geoip/GeoIP2-Country.mmdb');

  $record = $reader->country($ip_address);

  return $record->country->isoCode;
}

我将GeoIP2库放在third_party文件夹中,并将mmdb文件放在公用文件夹中。这对我来说可以。我希望能节省一些人的时间:))

答案 1 :(得分:0)

GeoIp2 php sdk利用了CodeIgniter框架不支持的PHP命名空间功能,这就是您在尝试加载库时遇到错误的原因。您链接的帖子使用spl_autoload提供解决方案,但是我不使用CodeIgniter并且没有使用GeopIp2 php sdk测试它。

答案 2 :(得分:0)

您可以在CodeIgniter中嵌入此方法。

首先,您需要将其包含在脚本中:

require_once( 'GeoIp2/vendor/autoload.php' );
use GeoIp2\Database\Reader;

接下来,我为Reader()调用检测方法

$reader = new Reader('GeoIp2/GeoIP2-City.mmdb');
$record = $reader->city($ip);

// Country (code)
$record->country->isoCode; 

// State
$record->mostSpecificSubdivision->name; 

// City
$record->city->name; 

// zip code
$record->postal->code; 

我刚刚在CodeIgniter 3x上进行了测试并且正常工作。

我使用过桥类。在/application/libraries内创建一个名为CI_GeoIp2.php的文件,并添加以下代码。

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * GeoIp2 Class
 *
 * @package       CodeIgniter
 * @subpackage  Libraries
 * @category      GeoIp2
 * @author        Timothy Marois <timothymarois@gmail.com>
 */
require_once( APPPATH . 'third_party/GeoIp2/vendor/autoload.php' );
use GeoIp2\Database\Reader;

class CI_GeoIp2 { 

    protected $record;
    protected $database_path = 'third_party/GeoIp2/GeoIP2-City.mmdb';

    public function __construct() {

        $ci =& get_instance();
        $reader = new Reader(APPPATH.$this->database_path);

        $ip = $ci->input->ip_address();
        if ($ci->input->valid_ip($ip)) {
            $this->record = $reader->city($ip);
        }

        log_message('debug', "CI_GeoIp2 Class Initialized");
    }


    /**
     * getState()
     * @return state
     */
    public function getState() {
        return $this->record->mostSpecificSubdivision->name;;
    }


    /**
     * getState()
     * @return country code "US/CA etc"
     */
    public function getCountryCode() {
        return $this->record->country->isoCode;
    }


    /**
     * getCity()
     * @return city name
     */
    public function getCity() {
        return $this->record->city->name;
    }


    /**
     * getZipCode()
     * @return Zip Code (#)
     */
    public function getZipCode() {
        return $this->record->postal->code;
    }


    /**
     * getRawRecord()
     * (if you want to manually extract objects)
     *
     * @return object of all items
     */
    public function getRawRecord() {
        return $this->record;
    }

}

现在您可以使用

自动加载或加载它
 $this->load->library("CI_GeoIp2");

我更喜欢在autoload.php config

下自动加载它
 $autoload['libraries'] = array('CI_GeoIp2'=>'Location');

所以在我使用的脚本中,

$this->Location->getState() 
$this->Location->getCity() 

......等等