2

ユーザーの国を自動的に識別したいプログラムを書いていました。IPを取得してDBに保存するコードを書きました。

$ip = gethostbyname($_SERVER['REMOTE_ADDR']);

保管:

 <?php `$result = mysql_query("INSERT INTO `wh_order` (`name`, `email`, `contact`, `itemid`, `itemquantity`, `ip`,`message`, `date`) VALUES('".$name."','".$email."','".$contact."','".$itemid."','".$itemquantity."','".$ip."','".$message."', NOW())");` ?>

また、これはIPアドレスを保存する最良の方法ですか?

4

4 に答える 4

7

まず、gethostbyname では国が表示されません。そのためには、地理位置情報に頼る必要があります。問題なく動作する無料サービスはhttp://freegeoip.netです。API を提供します。

http://freegeoip.net/json/74.125.143.104

どちらが返されますか:

{
    "city": "Mountain View",
    "region_code": "CA",
    "region_name": "California",
    "metrocode": "807",
    "zipcode": "94043",
    "longitude": "-122.057",
    "latitude": "37.4192",
    "country_code": "US",
    "ip": "74.125.227.136",
    "country_name": "United States"
}

IP によるジオロケーションは 100% 正確ではないことに注意してください。


IP アドレスを格納するのに最適な列タイプは ですINT(10) unsigned。これは、varchar 列よりもスペースを占有しません。変換はINET_ATONINET_NTOAで簡単に処理できます:

mysql> SELECT INET_ATON('10.0.5.9');
        -> 167773449

mysql> SELECT INET_NTOA(167773449);
        -> '10.0.5.9'
于 2012-06-12T07:11:29.013 に答える
1

maxmind (http://www.maxmind.com/app/country) のデータベースを apache または nginx 拡張機能と組み合わせて使用​​できます。

別の方法として、このタスクに適したライブラリがあります: http://geocoder-php.org/

于 2012-06-12T07:26:25.173 に答える
0

IP によってユーザーの場所を特定することをGeolocationと呼びます。通常、IP アドレスの範囲を地理的な場所にマップするデータベースが必要です。

Maxmind 社は、CreativeCommons ライセンスの下で、GeoLiteと呼ばれるこのようなデータベースを無料で提供しています。

GeoLite データベースは、Creative Commons Attribution-ShareAlike 3.0 Unported License の下でライセンスされています。商用ライセンスが利用可能です。

迅速な IP ルックアップを可能にする apache モジュールがありますが、最も簡単な開始方法は、おそらく純粋な PHP オプションです。可能な統合方法のリストを確認してください。

ダウンロード アーカイブにはいくつかの例が含まれています。基本的なプロセスはかなり単純です。

$gi = geoip_open("GeoLite.dat", GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, "24.24.24.24");
echo $record->latitude;
echo $record->longitude;
于 2012-06-12T07:22:06.183 に答える