0
type    ip_start    ip_end          country     state       city

ipv4    0.0.0.0     0255.255.255    US          California  Los Angeles
ipv4    1.0.0.0     1.0.0.255       AU          Queensland  Brisbane

国、州、都市の IP リストを含むテーブルがあります。

私の質問は、データベースからユーザーのIPロケーションを検出する方法です

PHPを使用$ip = $_SERVER["HTTP_CLIENT_IP"]; , HTTP_X_FORWARDED_FOR & REMOTE_ADDRしてユーザーのIPを見つける場合。

この変数を使用して、データベースからどの国、州、都市を見つけることができますか?

ip_start と ip_end はどのように機能しますか?

元。私のIPが $ip=123.243.51.83;

この $ip を使用して、データベースから場所を見つけるにはどうすればよいですか?

4

2 に答える 2

1

IP アドレスを整数表現で保存するとよいでしょう。これには、MySql 関数INET_ATONを使用できます。

PHPでは、次のように計算できます。

$address = '174.36.207.186';

$addressArray = explode('.', $address);

$integerIp =   ( 16777216 * $addressArray[0] )
             + (    65536 * $addressArray[1] )
             + (      256 * $addressArray[2] )
             +              $addressArray[3];

クエリ ( DB に整数として格納した場合) は次のようになります。

SELECT *
FROM table
WHERE
".$integerIp." BETWEEN ip_start AND ip_end
LIMIT 1

ジムが答えたように、DB で直接変換を行うこともできますが、事前計算できるのであれば、DB に計算を任せるのはなぜですか?

于 2013-08-13T12:48:42.357 に答える
1

IP アドレスは数値に変換できます。これを使用して、IP がどの範囲にあるかを調べることができます。

MySQL とINET_ATON:

SELECT country FROM table WHERE 
INET_ATON("123.243.51.83") BETWEEN INET_ATON(ip_start) AND INET_ATON(ip_end);

PHP と の使用ip2long:

$yourIpLong = ip2long($yourIp);
if($yourIpLong > ip2long($ipStart) && $yourIpLong < ip2long($ipEnd)){
     //IP is in range $ipStart -> $ipEnd
}else{
    //IP is not in range.
}

これらのソリューションは両方とも IPv4 用であることに注意してください。

于 2013-08-13T12:41:26.760 に答える