MySQLにIPアドレスを記録する
"insert into TABLE values('" . $_SERVER['REMOTE_ADDR'] . "')";
とかのSQLを投げるコードを書いてたら、ハナで笑われました(涙
「なにコレ? フツーロングIPでしょ(^^;)」
ロングIP…?? 初めて聞く言葉なので、とりあえず調べてみることに。
ドットがなく10進数のものは、ロングIPアドレスと言う。
はぁ成る程。32ビットなIPアドレスの値を、そのまま10進数で書く書き方があるんですな。ということで、
$ip = explode(".", $_SERVER['REMOTE_ADDR']);
$longip = $ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3];
$longip = $ip[0]*16777216 + $ip[1]*65536 + $ip[2]*256 + $ip[3];
というコードを書いたら、更に笑われることに(泣
「PHPならip2long使えば…?(^^;)」
どうやら自分で計算しなくても、PHPにはip2lomgとかlong2ipといった専用の関数が、ちゃんとビルトインで用意されてる模様(T_T)
<?php
$longip = sprintf("%u", ip2long("202.67.19.107"));
$ip = long2ip(-(4294967296-$longip));
echo $longip . "<br>\n";
echo $ip . "<br>\n";
echo gethostbyaddr($ip) . "<br>\n";
?>
$longip = sprintf("%u", ip2long("202.67.19.107"));
$ip = long2ip(-(4294967296-$longip));
echo $longip . "<br>\n";
echo $ip . "<br>\n";
echo gethostbyaddr($ip) . "<br>\n";
?>
結果>
3393393515
202.67.19.107
opt-202-67-19-107.client.pikara.ne.jp
値の桁数が多すぎるせいか、引き算とか挟まないとちゃんとした値が出ない→ちとめんどくさいけど、とりあえず動くことは確認しました。
ちなみにMySQLに格納するのであれば、MySQLにINET_ATONという関数が用意されてるので、
"insert into TABLE values(inet_aton('" . $_SERVER['REMOTE_ADDR'] . "'))"
でいけるみたいです。確かにコレはラクチンだし、データが嵩張らなくて良い感じかも(^_^)
なお、こうしてロングIPを記録するカラムは32ビットなINT型で構わないんすが、
ip int(20) unsigned NOT NULL default '0'
とかして符号なし整数(unsigned)にしとかないと、桁数溢れで値が化けました。要注意(^_^;)