Използване на maxmid GeoIP2 PHP API с CodeIgniter

Опитвам се да използвам GeoIP2 PHP API ( https://github.com/maxmind/GeoIP2-php ) в рамките на CodeIgniter. Как мога да заредя GeoIP2 и да го използвам за геолокация на потребител?

Опитах да го заредя така:

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

or

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

or

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

Получавам тази грешка: „Не мога да заредя заявения файл: ProviderInterface“

Разгледах това Пространство от имена в PHP CodeIgniter Framework, но имам малко опит с пространства от имена.

Няма успех с това, не печеля, наистина не знам как да внедря това в CodeIgniter.


person themban    schedule 21.06.2014    source източник


Отговори (3)


Опитвах се да намеря решението на този въпрос. Но не можах да намеря в 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 файла в публичната папка. Работи добре за мен. Надявам се, че ще спести нечие време :)

person munjal    schedule 03.11.2016

GeoIp2 php sdk се възползва от функцията за пространство от имена на PHP, която рамката CodeIgniter не поддържа, поради което получавате грешката, когато се опитате да заредите библиотеката. Публикацията, към която сте се свързали, предлага решение с помощта на spl_autoload, но аз не използвам CodeIgniter и не съм го тествал с GeopIp2 php sdk.

person cruzzzin    schedule 21.06.2014

Няколко начина, по които можете да вградите това в 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 <[email protected]>
 */
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() 

... и така нататък

person tmarois    schedule 09.12.2015