1. 動作確認

PHPの関数ip2long()、long2ip()と、MySQLのIPv4アドレス保存のテスト

関連: PHP・ネットワーク関係

動作確認

MySQLにIPv4アドレス保存テスト用テーブルを作成し、PHPからPDOでIPv4アドレスのライトとリードのテストをします。

  • テーブルの準備

  • プログラムテストのため、IPv4アドレスを保存するカラムを持つテーブルlogを作成します。 テーブル定義は以下になります。

    CREATE TABLE log (
      id INTEGER PRIMARY KEY AUTO_INCREMENT,
      ip INTEGER UNSIGNED DEFAULT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    テストデータを1つインサートしておきます。

    mysql> INSERT INTO log(ip) VALUES(INET_ATON('127.0.0.1'));
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT id, INET_NTOA(ip) FROM log;
    +----+---------------+
    | id | INET_NTOA(ip) |
    +----+---------------+
    |  1 | 127.0.0.1     |
    +----+---------------+
    1 row in set (0.00 sec)

  • テストプログラム

  • <?php
    
    class DbConfig {
            public $connector = 'mysql';
            public $host = 'localhost';
            public $dbname = 'test';
            public $user = 'user';
            public $password = 'password';
    }
    
    class Dao {
            protected $encoding = 'UTF8';
    
            protected $tableName = 'log';
    
            protected $config;
            protected $pdo;
    
            function  __construct($config = null) {
                    $this->config = $config;
            }
    
            public function getConfig() {
                    return $this->config;
            }
    
            public function getEncoding() {
                    return $this->encoding;
            }
    
            public function getDsn($config) {
                    $dsn = sprintf("%s:host=%s;dbname=%s;charset=utf8;",
                                    $this->config->connector,
                                    $this->config->host,
                                    $this->config->dbname
                    );
                    return $dsn;
            }
    
            public function connect() {
                    if (empty($this->pdo)) {
                            $dsn = $this->getDsn($this->config);
                            $user = $this->config->user;
                            $password = $this->config->password;
    
                            $this->pdo = new PDO($dsn, $user, $password);
    
                            // SQL実行エラーで例外を発生する
                            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                            $this->pdo->query("SET NAMES '" .$this->getEncoding() ."';");
                    }
                    if (is_null($this->pdo)) {
                            throw new Exception("pdo error");
                    }
                    return $this->pdo;
            }
    
            public function close($pdo = null) {
                    if (is_null($pdo)) {
                            $db = $pdo;
                    } else {
                            if (empty($this->pdo)) {
                                    return;
                            }
                            $db = $this->pdo;
                    }
                    $db = null;
            }
    
            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 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 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);
            }
    
            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);
            }
    }
    
    $dbConfig = new DbConfig();
    $dao = new Dao($dbConfig);
    
    $dao->connect();
    $dao->select();
    print("\n");
    
    $dao->insert('192.168.10.5');
    $dao->insertOther('255.255.255.254');
    print("\n");
    
    $dao->selectOther();
    $dao->close();

  • テスト実行

  • php test.php
    ip: 2130706433 (127.0.0.1)
    
    inserted ip: 192.168.10.5
    inserted ip: 255.255.255.254
    
    ip: 2130706433 (127.0.0.1)
    ip: 3232238085 (192.168.10.5)
    ip: 4294967294 (255.255.255.254)