0

IP アドレスに基づいてユーザーの国を事前に選択できる国ドロップダウンを作成したいと考えています。たとえば、ユーザーがイタリアにいる場合、リスト内の他のすべての国を維持しながら、最初にイタリアを表示する必要があります。

私はたくさん検索し、Maxmind GeoIP API とデータベースをダウンロードすることから始めました。これは私が試したもので、IPで国を事前に選択せずに通常のドロップダウンリストのみを表示します:

  <select name="" multiple="multiple" width="200px" size="10px">
  <?php  

  require 'vendor/autoload.php'; //I put this is /var/www where my php file is  

  $gi = geoip_open('/usr/local/share/GeoIP/GeoIP.dat', GEOIP_STANDARD);
  $ip =  $_SERVER['REMOTE_ADDR'];
  echo $ip;
  $preselect_country = geoip_country_code_by_addr($gi, $ip);

  //newCountry.php is where I select all countries for drop down list
  include('newCountry.php');

  while ($line = mysql_fetch_array($result)) {

       if($preselect_country == $line){
         $selected = "selected";
     }else{
         $selected = "";
      }
  ?>

   <option value="<?php echo $line['country'];?>"<?php echo $selected; ?>><?php echo $line['country'];?> </option>;

  <?php
   }
  ?>
     geoip_close($gi);

 ?>
 </select>

私は本当に自分で解決策を見つけるために最善を尽くしました。これらの同様の質問をすべて読み、次のような他の解決策も試しました: Geopluginを使用した国に基づく自動ドロップダウン、phpでIPアドレスを使用して現在の国名を取得、 IPアドレスの国を取得PHPを使用して、訪問者の国を IPなどから取得しますが、なぜ機能しないのかわかりません。私はうまくいったこのコードを試したので、IPを取得できることがわかりました:

 $ip =  $_SERVER['REMOTE_ADDR']; 
  echo $ip;

また、このサンプルは私にとってはうまくいきました(出力はESスペインです)、

<?php

 require 'vendor/autoload.php';

 $gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);

 echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
 geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";

 geoip_close($gi);

 ?>

しかし、「80.24.24.24」を $ip に置き換えるだけでまったく同じコードを試してみると、何も返されません!!

#EDIT: @vch のおかげで、問題はプライベート ネットワーク用であるため、私の IP に関連していることがわかりました。そのため、ifconfig で実際のインターネット IP を取得し、それをコードで使用したところ、うまく機能しました。この時点まで、インストールした geoip api に問題はなく、ドロップダウンの事前選択もうまく機能することがわかりました。

これは新しいコードです:

<select name = "question" class = "question" id = 'Question'> 
<?php

require 'vendor/autoload.php';

$gi = geoip_open('/usr/local/share/GeoIP/GeoIP.dat', GEOIP_STANDARD);
$ip = "131.175.122.222";

$preselect_country = geoip_country_name_by_addr($gi, $ip);  

include('newCountry.php');

while ($line = mysql_fetch_array($result)) {

   if($preselect_country == $line['country']){
       $selected = "selected";
   }else{
       $selected = "";
    }


 echo "<option value=\"{$line['country']}\" {$selected}>{$line['country']}</option>\n";
 }
   geoip_close($gi);

?>
</select>

私の質問は、ユーザーが私のようなプライベート ネットワークを使用している場合に、ユーザーの実際のインターネット IP を取得する方法です。

すべてのアイデアは高く評価され、

ありがとう、

4

1 に答える 1

0

以下のコードを使用して IP を取得してみてください。正確な IP が返されることを願っています。

$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');
于 2014-09-22T10:21:52.363 に答える