MySQLにIPアドレスを記録する

投稿日:

PHPMySQLにIPアドレスを記録しようと

"insert into TABLE values('" . $_SERVER['REMOTE_ADDR'] . "')";

とかのSQLを投げるコードを書いてたら、ハナで笑われました(涙

「なにコレ? フツーロングIPでしょ(^^;)」

ロングIP…?? 初めて聞く言葉なので、とりあえず調べてみることに。

IPアドレス - Wikipedia

ドットがなく10進数のものは、ロングIPアドレスと言う。

はぁ成る程。32ビットなIPアドレスの値を、そのまま10進数で書く書き方があるんですな。ということで、

$ip = explode(".", $_SERVER['REMOTE_ADDR']);
$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";

?>

結果>

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)にしとかないと、桁数溢れで値が化けました。要注意(^_^;)