理想的には、任意の Web ブラウザーから照会できる PHP スクリプトをまとめようとしており、PHP スクリプトにアクセスした IP アドレスの国を返します。
これは可能ですか、それともより良い解決策がありますか?
理想的には、任意の Web ブラウザーから照会できる PHP スクリプトをまとめようとしており、PHP スクリプトにアクセスした IP アドレスの国を返します。
これは可能ですか、それともより良い解決策がありますか?
次のような、無料で簡単に使用できる API があります。
どちらが最も信頼できるように見えるかはあなた次第です:)
それ以外の場合は、サーバー上のローカル データベースに基づくスクリプトがあります。ただし、データベース データは定期的に更新する必要があります。これをチェックしてください:
チッ!
編集: もちろん、プロジェクトによっては、HTML5 の場所の機能を見たいと思うかもしれません。Internet Explorer ではまだ使用できません (IE9 でサポートされる予定ですが、まだ長い道のりです) が、視聴者が主にモバイル デバイスを使用している場合、または Safari/Firefox を使用している場合は、確認する価値があります。
座標を取得したら、それらを国コードにリバース ジオコーディングできます。ここでも、次のような API があります。
更新、2013 年 4 月
本日は、 Geocoderを使用することをお勧めします。これは、IP アドレスや住所データのジオコーディングを非常に簡単にする PHP ライブラリです。
***更新、2016 年 9 月
Google のプライバシー ポリシーが変更されたため、サーバーに HTTPPS 証明書がない場合、またはユーザーが自分の場所を確認することを許可していない場合、HTML5 Geolocation API を使用できません。これで、ユーザーの IP を使用して PHP にチェックインしたり、HTTPS 証明書を取得したりできます。
これを行うさまざまな Web API があります。私のサービスhttp://ipinfo.ioを使用した例を次に示します。
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $details->country; // -> "US"
Web API は迅速かつ簡単なソリューションですが、多くのルックアップを行う必要がある場合は、自分のマシンに IP -> 国データベースを用意することをお勧めします。MaxMind は、GeoIPを含むさまざまな PHP ライブラリで使用できる無料のデータベースを提供しています。
MaxMind から IP テーブルをダウンロードできます。
http://www.maxmind.com/app/geolite
CSV をデータベースにインポートします (必ず ip_long_from + ip_long_to のインデックスを作成してください)。次に、次のように簡単に実行できます。
$iplong = ip2long($_SERVER['REMOTE_ADDR']);
// should use mysqli with prepared statements etc, but just an example
mysql_query("
SELECT country
FROM ip_table
WHERE $iplong BETWEEN ip_long_from AND ip_long_to
LIMIT 1
");
http://www.geoplugin.net/json.gpを使用した例を次に示します。
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
「その他の基本的な拡張機能」の下にある GeoIP 機能を見てください。 http://php.net/manual/en/book.geoip.php
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
国コードを取得します。
多くの回答があるようですが、誰もhttps://freegeoip.net/に言及していません
まで許可されてい15,000 queries per hour
ます。ほとんどの場合、それで十分だと思います。それ以外の場合は、MaxMind GeoIPのローカル データベースの使用を検討する必要があります。
Freegeoip はオープンソースであり、 githubでソースを見つけてローカルにデプロイし、クエリの制限を取り除くことができます。
また、サービスは緯度/経度/タイムゾーンおよびその他の便利なものを提供します。
可能であれば、 PHP の GeoIP 拡張機能をインストールして使用します。debian lenny の場合:
sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
sudo gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
sudo apt-get install php5-geoip
# or sudo apt-get install php-geoip for PHP7
次に、PHP で試してみます。
$ip = $_SERVER['REMOTE_ADDR'];
$country = geoip_country_name_by_name($ip);
echo 'The current user is located in: ' . $country;
戻り値:
The current user is located in: Cameroon
パフォーマンスを向上させ、ウェブサイトから外部サービスを要求しないために、適切で更新されたデータベースが必要な場合は、更新された正確なデータベースをダウンロードするのに適した場所がここにあります。
私の経験では、他のほとんどのデータベース/APIが私の場所を含めたり報告したりできなかった私のIPの都市や国の場所を含めてもうまく機能していたので、このデータベースに誘導したこのサービスを除いて、これをお勧めします.
(私のIPロケーションは、テスト時に「イラン」の「ラシュト」市からのもので、IPは次のとおりでした:に2.187.21.235
等しい45815275
)
したがって、どちらのサービスがより正確かわからない場合は、次のサービスを使用することをお勧めします。
データベース:
http://lite.ip2location.com/databases
API サービス:
http://ipinfodb.com/ip_location_api.php
このブログ記事はとても役に立ちました。それは私の日を救った。 http://www.techsirius.com/2014/05/simple-geo-tracking-system.html
基本的に、IP データベース テーブルをインストールしてから、場所の IP に対して mysql クエリを実行する必要があります。
<?php
include 'config.php';
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die(mysql_error());
mysql_select_db(DB_NAME) OR die(mysql_error());
$ip = $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";
$result = mysql_query($sql) OR die(mysql_error());
$ip_detail = mysql_fetch_assoc($result);
if($ip_detail){
echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city'];
}
else{
//Something wrong with IP
}
https://www.geoip-db.comのサービスを試すことができます。JSON または JSONP コールバック ソリューションを提供します。
<?php
$json = file_get_contents("https://www.geoip-db.com/json");
$data = json_decode($json);
print $data->country_code . "<br>";
print $data->country_name . "<br>";
print $data->state . "<br>";
print $data->city . "<br>";
print $data->postal . "<br>";
print $data->latitude . "<br>";
print $data->longitude . "<br>";
print $data->IPv4 . "<br>";
?>
ウィジェットwww.feedsalive.comを使用して、国情報と最後のページ情報も取得します。