1

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」

PHP CodeIgniter Frameworkでこの名前空間を見てきましたが、名前空間の経験はほとんどありません。

これで成功しません。私は勝っていません。CodeIgniter 内でこれを実装する方法が本当にわかりません。

4

3 に答える 3

1

私はこの質問の解決策を見つけようとしていました。しかし、スタックオーバーフローでは見つかりませんでした。ここに自分のコードを書いています。多分、それは誰かのために役立つでしょう。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 ファイルを public フォルダーに配置しました。それは私にとってはうまくいきます。誰かの時間を節約できることを願っています:)

于 2016-11-03T18:20:27.090 に答える
0

GeoIp2 php sdk は、CodeIgniter フレームワークがサポートしていない PHP の名前空間機能を利用しているため、ライブラリをロードしようとするとエラーが発生します。リンク先の投稿では、spl_autoload を使用したソリューションが提供されていますが、私は CodeIgniter を使用しておらず、GeopIp2 php SDK でテストしていません。

于 2014-06-21T22:10:27.930 に答える
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() 

... 等々

于 2015-12-09T17:42:35.857 に答える