1. IPv4アドレスの文字列(ドット表示)と整数の変換

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" になります。

    long2ip (PHPマニュアル)

  • ip2long

  • 文字列のインターネット標準ドット表示のIPアドレス(例 "192.168.1.2")を整数値 ( IPv4 インターネットネットアドレス)に変換したい場合、ip2long()関数を使用します。

    $s = ip2long('10.1.2.3');   // $s => 167838211 になります。

    ip2long (PHPマニュアル)

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