IPアドレスによる振り分け

このQ&Aのポイント
  • PHPのPEARのNet_GeoIPを使用して、IPアドレスによりページを振り分けるソースを書いています。
  • 特定のページへは九州地区からのアクセスのみ振り分けたいですが、MaxMindのサイトからダウンロードしたデータベースを使用してうまく動作しません。
  • PHPのモジュールを利用して都市名までの情報を取得しようとしていますが、うまくいきません。どうすればいいでしょうか。
回答を見る
  • ベストアンサー

IPアドレスによる振り分け

php、PEARのNet_GeoIPの使用して IPアドレスによりページを振り分けるソースを書いています。 やりたいことは、 「九州地区からのアクセスのみ特定のページへ振り分ける。」 です。 MaxMindのサイトから、無料のデータベースをダウンロードして 使用しているのですが、うまく動作しません。 MaxMind に用意されているPHP用のモジュールを利用して 以下のようにソースを書いています。 ======== include("./geoipcity.inc"); include("./geoipregionvars.php"); $city_name = ""; $region_name = ""; $gi = geoip_open(MY_DIR."*****/GeoLiteCity.dat",GEOIP_STANDARD); $record = geoip_record_by_addr($gi,$str_valip); $region_name = $record->region; $city_name = $record->city; geoip_close($gi); ======== 都市名までの情報が得られるはずなのですが うまくいきません。 どうすればいいのでしょうか。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • NARH
  • ベストアンサー率82% (88/107)
回答No.2

確かカバー率悪かったと聞いていたので、自宅のIPを geoiplookup コマンドで試してみましたところ都市名は表示されませんでした。 % geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat xxx.xxx.xxx.xxx GeoIP City Edition, Rev 1: JP, N/A, N/A, N/A, 36.000000, 138.000000, 0 東経と北緯もデフォルト値のようです。 ただ、幾つか試してみると表示されるものもありますが、都内のはずが栃木県だったりと アテにならない様です。 参照URLにカバー率っぽく書かれてますが 25 mile って 40Km 誤差は日本だとけっこうでかいですね。 僕は国判定にしか使ってませんです。 なので、回答としては 「データファイル GeoLiteCity.dat にあれば表示されますが、無いものは出ません。」 となるのかな。 もし確実にデータにあることが判明しているが、出ないのであればプログラム側の問題ですね。 (見た感じ var_dump( $record ) すればわかりそうなので大丈夫そうですが)

参考URL:
http://www.maxmind.com/app/geolite_city_accuracy
shuna08
質問者

お礼

回答ありがとうございます。 返礼書くのが遅くなりすみません。 細かく書いていただいてありがとうございます。 データファイルにないため表示されないということですね。 ありがとうございます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

同ライブラリをつかってないのでなんとも言えないですが 文法や関数の使い方が正しいのであれば フリー版は地域データベースをもっていないようですし もし非フリー版を利用ならメンテナンスが不十分で正しい都市を 返してくれない可能性もあります。 ぐぐったところこちらがヒットしましたがどうでしょう?

参考URL:
http://metaboy.blog23.fc2.com/blog-entry-788.html
shuna08
質問者

お礼

回答ありがとうございます。 返信が遅くなり申し訳ありません。 参考URLも確認しました。 こちらのとおりにやってみたけど、やはり同じ結果でした。 フリー版ということで地域データを持ってないということですね。 ありがとうございました。

関連するQ&A

  • phpでランダムにページを表示

    001.html~999.htmlの内容をランダムにPHPを使用しページを 表示させたいのですが以下のソースでは01.html表示になり 困っています。 <?php $dir_name = "ads"; $ads = array(); $dh = opendir($dir_name); while ($data = readdir($dh)) { if (!is_dir($data)) { array_push($ads, $data); } } closedir($dh); shuffle($ads); include("$dir_name/$ads[0]"); ?> どのようにすれば001になるのでしょうか、 どなたかご教示お願い致しますm(_ _)m

    • ベストアンサー
    • PHP
  • フォルダ内のHTMLにランダムに飛ばす

    以下のソースでadsフォルダ内にあるhtmlファイルを ランダムに呼び出しているのですが 実行をすると正常に表示をするときと ページが真っ白で何も表示しないときがあり困っています。 どなたかどこに問題があるか分かる方宜しければ 教えて頂けないでしょうか。 宜しくお願い致します<(_ _)> (ソース) <?php $dir_name = "ads"; $ads = array(); $dh = opendir($dir_name); while ($data = readdir($dh)) { if (!is_dir($data)) { array_push($ads, $data); } } closedir($dh); shuffle($ads); include("$dir_name/$ads[0]"); ?> (プログラムの目的) adshuffle.phpにアクセスするとadsフォルダ内にあるhtmlを ランダムに読み込む。 (階層) |_adshuffle.php |_ ads  |_ 001.html  |_ 002.html  |_ ・  |_ ・  |_ ・  |_ 999.html *最終的な目的は999までhtmlを増やしていく予定です。

    • ベストアンサー
    • PHP
  • MACアドレス C言語

    eclipseでインターネットにあるMACアドレスを取得するプログラムをコピペしました。 それでMACアドレスが正常に取得されているかどうかはどこでわかるのでしょうか? ソースコードを貼り付けさせて頂きます。(C言語で御座います。) #include <stdio.h> #include <string.h> #include <ifaddrs.h> #include <sys/socket.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> int main() { struct ifaddrs *ifa_list, *ifa; struct sockaddr_dl *dl; char name[12]; unsigned char *addr; if (getifaddrs(&ifa_list) < 0) { return 1; } for (ifa = ifa_list; ifa != NULL; ifa = ifa->ifa_next) { dl = (struct sockaddr_dl*)ifa->ifa_addr; if (dl->sdl_family == AF_LINK && dl->sdl_type == IFT_ETHER) { memcpy(name, dl->sdl_data, dl->sdl_nlen); name[dl->sdl_nlen] = '\0'; addr = LLADDR(dl); printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); } } freeifaddrs(ifa_list); return 0; } eclipseのコンソール画面には何も出ないので困っています。 非常に馬鹿ですがキーワードだけでも零してもらえると嬉しいです。

  • PEARの参照先

    PHP5環境下でPEARモジュールをインストールしましたが、実行時にモジュールがないというエラーメッセージが表示され、対応をしています。 お助けください。 1.現象  PHP5のプログラム実行時にエラーとなってしまい、下記のメッセージが表示されました。 Warning: require_once(Cache/Lite.php) [function.require-once]: failed to open stream: No such file or directory in ・・・ Fatal error: require_once() [function.require]: Failed opening required 'Cache/Lite.php' (include_path='.:/home/example/share/pear5') in ・・・ 2.環境  ・さくらインターネット(FreeBSD)でPHP5を独自にインストールしPEARライブラリも導入済です。    PHP5実行ファイルのインストール先 /home/example/www/cgi-bin  ・phpinfo()で確認した、include_pathは下記の通りです。    .:/home/example/share/pear5  ・pear config-show で確認した結果は、下記の通りです。    pear config-set bin_dir /home/example/share/pear5/bin    pear config-set doc_dir /home/example/share/pear5/PEAR/docs    pear config-set ext_dir /home/example/share/pear5/PEAR/extensions    pear config-set php_dir /home/example/share/pear5/PEAR    pear config-set cache_dir /home/example/share/pear5/PEAR/cache    pear config-set data_dir /home/example/share/pear5/PEAR/data    pear config-set php_bin /home/example/www/cgi-bin    pear config-set test_dir /home/example/share/pear5/PEAR/tests    pear config-set download_dir /home/example/share/pear5/temp/download    pear config-set temp_dir /home/example/share/pear5/temp  ・pear list で確認した結果は、下記の通りです。    Archive_Tar 1.3.2 stable    Cache_Lite 1.7.2 stable    Console_Getopt 1.2.2 stable    HTML_Templete_IT 1.2.1 stable    Net_UserAgent_Detect 2.2.0 stable    PEAR 1.5.1 stable    PEAR_Frontend_Web 0.5.1 alpha    Structures_Graph 1.0.2 stable ・Cache_Liteの所在     /home/example/share/pear5 の中で、Cache_Lite らしきモジュールを     探してみたところ、下記のディレクトリにありました。          /home/example/share/pear5/PEAR/Cache        Lite.php      /home/example/share/pear5/PEAR/Cache/Lite        File.php        Function.php        Output.php      /home/example/share/pear5/PEAR/tests/Cache_Lite/tests        拡張子.phptのファイルが多数   ・PEARおよび、モジュールのインストールは下記のサイトを参照して実行しています。    http://zenryokuhp.com/server/sakura_pear.htm 3.疑問点   ・モジュールは、include_pathで指定されている、      /home/example/share/pear5    の直下に置かなければならないのでしょうか。   ・現在、モジュールは /home/example/share/pear5/PEAR に存在しているのですが、    include_pathで指定した位置よりも、1階層下に置いてはいけないのでしょうか。   ・再度、PHP5とPEARのインストールをやり直し、pear config-set コマンドにて、      pear config-set php_dir /home/example/share/pear5/    と設定し、モジュール"Cache_Lite"をインストールしようとしましたが、      "Cannot install, php_dir for channel "pear.php.net" is not writeable the current user"    と表示されて、インストールが出来ませんでした。    /home/example/share/pear5/ ではインストール出来ず、    /home/example/share/pear5/PEAR ではインストール出来るというのは、    PHP5をインストールしたときに同時に登録されるPEARのディレクトリには    インストール出来ないということなのでしょうか。 以上、ご教授をお願いいたします。

    • 締切済み
    • PHP
  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • PHPでのクッキー

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 直接form2.phpへ飛ぶと、クッキーの値がなくなってしまいます。 setcokkieが、何の値もないのを上書きしていることは理解できるのですが、これを上書きせず回避?する方法はありますでしょうか? よろしくお願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • PEARでrequestする方法

    PEARのインストールを終え pere listで確認をしたのですが requestでしていた場所のphpをうまく読み込んでくれません。 ソースでは ini_set('include_path', ".:/PEAR"); require( "Cache.php" ); require( "Services/AmazonECS4.php" ); とあります 実際のファイルは C:\xampp\php\PEAR\PEAR にあります。 php.iniの;extension=の;をはずしたりしないといけないのでしょうか?

    • 締切済み
    • PHP
  • レンタルサーバでのPEAR

    レンタルサーバでPEARを使用しようとしてます。 PEAR自体はインストールされていますが、新規のパッケージをインストールすることができないため、ネットで調べて下記のようにしています。 PEARのCaledarパッケージを /home/xxxx/PEARにコピー (開発環境で使用したパッケージです) PHPのソースにて ini_set('include_path','.:/home/xxxx/PEAR'); include '/Calendar/Month/Weekdays.php'; として実行したところ Warning: include(/Calendar/Month/Weekdays.php) [function.include]: failed to open stream: No such file or directory in /home/xxxx/public_html/php/schedule.php on line 4 Warning: include() [function.include]: Failed opening '/Calendar/Month/Weekdays.php' for inclusion (include_path='.:/home/xxxx/PEAR') in /home/xxxx/public_html/php/schedule.php on line 4 と出てしまいます。 確かにパッケージは存在するのですが・・・・ 参考になるサイトでもかまいませんので、うろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのページが真っ白に【初心者です】

    (ラビットサーバーの専用サーバーからVPSへ) サーバーの移動をしました。 すると、PHPのページが真っ白になり表示されません。 ソースを見ると、以下のように表示されました。 php.iniファイルをいろいろ弄ってみたんですが、 なおりませんで、お知恵を拝借したく書き込みました。 よろしくお願いします。 <? $dir = "../"; include_once('../lib/session.lib'); $main_dsp = './main.tpl'; include_once('./html.php'); ?>

    • 締切済み
    • PHP
  • PEARのソースが一部しか読み込めない

    PEARをインストールしたのですが、phpのソースからのrequireがうまく行きません。 phpinfo()で見ると include_path .:/usr/local/PEAR .:/usr/local/PEAR となっており、実際 $ ls /usr/local/PEAR/ のコマンドで Archive/     MIME/   docs/ Config/   OS/   pearcmd.php* Config.php*   PEAR/   pearfrontendweb.php* Console/   PEAR.php*   peclcmd.php* HTML/   Structures/   tests/ MDB2/   System.php* MDB2.php*   data/ となります。 このうちPEARディレクトリ直下のConfig.phpやMDB2.phpなどは require 'Config.php'; require 'MDB2.php'; としてもエラーはおきません。 ですが、たとえば/usr/local/PEAR/OS/Guess.phpを使用しようとして require 'Guess.php'とすると、 Warning: require(Guess.php) [function.require]: failed to open stream: No such file or directory in /Users/muttuwo/Sites/test.php on line 2 Fatal error: require() [function.require]: Failed opening required 'Guess.php' (include_path='.:/usr/local/PEAR') in /Users/muttuwo/Sites/test.php on line 2 というエラーが出てしまいます。 PEAR直下のファイルしか読み込めない状態です。 include_pathはうまく行っているっぽいのでなぜか良くわかりません。。 エラーの原因を教えていただければ助かります。

    • ベストアンサー
    • PHP

専門家に質問してみよう