IPv4アドレスの文字列(ドット表示)と整数の変換
-
long2ip
整数値のIPv4アドレスを文字列のインターネット標準ドット表示のIPアドレス(例 "192.168.1.2")に変換したい場合、 long2ip()関数を使用します。
$d = long2ip(10*256*256*256 + 1*256*256 + 2*256 + 3); // $d => "10.1.2.3" になります。
ip2long
文字列のインターネット標準ドット表示のIPアドレス(例 "192.168.1.2")を整数値 ( IPv4 インターネットネットアドレス)に変換したい場合、ip2long()関数を使用します。
$s = ip2long('10.1.2.3'); // $s => 167838211 になります。
MySQL
MySQLで、IPv4アドレスをVARBINARY(4)やUNSIGNED INTEGER型で保存する場合、ip2longとlong2ipを使うことができます。
以下は、サンプルプログラムからip2long()やlong2ip()を使用している個所を抜き出したものです。
例
public function select() { $sql = "SELECT ip FROM $this->tableName"; $stmt = $this->pdo->prepare($sql); $ret = $stmt->execute(); if ($ret === FALSE) { throw new Exception("ERROR failed to select"); } while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $ip = $row['ip']; printf("ip: %10d (%s)\n", $ip, long2ip($ip)); } } public function insert($ip) { $sql = "INSERT INTO $this->tableName (ip) VALUES(?);"; $values = array(ip2long($ip)); $stmt = $this->pdo->prepare($sql); $ret = $stmt->execute($values); if ($ret === FALSE) { throw new Exception("Error failed to insert"); } printf("inserted ip: %s\n", $ip); }
MySQLにIPv4アドレスを保存する場合、PHPの関数long2ip()の替わりに、MySQLの組み込み関数INET_NTOA()を使用することができます。 この2つはどちらもIPアドレスの整数値をドット表示の文字列に変換します。
同様にPHPの関数ip2long()のかわりにMySQLの組み込み関数INET_ATON()を使用することができます。 こちらはドット表示文字列のIPアドレスを整数値に変換します。
例
public function selectOther() { $sql = "SELECT INET_NTOA(ip) AS ip FROM $this->tableName"; $stmt = $this->pdo->prepare($sql); $ret = $stmt->execute(); if ($ret === FALSE) { throw new Exception("ERROR failed to select"); } while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $ip = $row['ip']; printf("ip: %10d (%s)\n", ip2long($ip), $ip); } } public function insertOther($ip) { $sql = "INSERT INTO $this->tableName (ip) VALUES(INET_ATON(?));"; $values = array($ip); $stmt = $this->pdo->prepare($sql); $ret = $stmt->execute($values); if ($ret === FALSE) { throw new Exception("Error failed to insert"); } printf("inserted ip: %s\n", $ip); }