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);
}