[PHP]DB2接続:db2_connect関数の完全ガイド!

PHP

こんにちは!今回は、PHPのdb2_connect関数について詳しく解説します。IBM DB2データベースに接続するための重要な関数です。

1. db2_connect関数の基本情報

構文

db2_connect(
    string $database,
    string $username,
    string $password,
    array $options = []
): resource|false

基本説明

  • IBM DB2データベースへの接続を確立します
  • 成功時は接続リソースを返します
  • 失敗時はfalseを返します

2. 基本的な使用例

シンプルな接続例

<?php
$database = 'SAMPLE';
$user = 'db2user';
$password = 'password';

$conn = db2_connect($database, $user, $password);

if ($conn) {
    echo "DB2への接続に成功しました";
} else {
    echo "接続エラー: " . db2_conn_error();
}

オプションを使用した接続

<?php
$options = array(
    'DB2_ATTR_CASE' => DB2_CASE_NATURAL,
    'DB2_ATTR_CURSOR' => DB2_SCROLLABLE
);

$conn = db2_connect($database, $user, $password, $options);

3. 実践的な使用例

DB2接続マネージャークラス

<?php
class DB2Manager {
    private $conn;
    private $config;

    public function __construct(array $config) {
        $this->config = $config;
    }

    public function connect(): bool {
        try {
            $this->conn = db2_connect(
                $this->config['database'],
                $this->config['username'],
                $this->config['password'],
                $this->config['options'] ?? []
            );

            return $this->conn !== false;
        } catch (Exception $e) {
            error_log("DB2接続エラー: " . $e->getMessage());
            return false;
        }
    }

    public function disconnect(): bool {
        if ($this->conn) {
            return db2_close($this->conn);
        }
        return false;
    }

    public function getConnection() {
        return $this->conn;
    }

    public function query(string $sql) {
        if (!$this->conn) {
            throw new RuntimeException("データベース接続が確立されていません");
        }

        $stmt = db2_exec($this->conn, $sql);
        if ($stmt === false) {
            throw new RuntimeException("クエリ実行エラー: " . db2_stmt_error());
        }

        return $stmt;
    }
}

トランザクション管理の例

<?php
class DB2Transaction {
    private $db;

    public function __construct(DB2Manager $db) {
        $this->db = $db;
    }

    public function executeTransaction(callable $callback) {
        $conn = $this->db->getConnection();

        try {
            db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);

            $result = $callback($conn);

            db2_commit($conn);
            return $result;
        } catch (Exception $e) {
            db2_rollback($conn);
            throw $e;
        } finally {
            db2_autocommit($conn, DB2_AUTOCOMMIT_ON);
        }
    }
}

// 使用例
$dbManager = new DB2Manager([
    'database' => 'SAMPLE',
    'username' => 'user',
    'password' => 'pass'
]);

$transaction = new DB2Transaction($dbManager);

try {
    $transaction->executeTransaction(function($conn) {
        db2_exec($conn, "INSERT INTO users (name) VALUES ('John')");
        db2_exec($conn, "UPDATE balance SET amount = amount - 100");
        return true;
    });
} catch (Exception $e) {
    echo "トランザクションエラー: " . $e->getMessage();
}

接続プール管理

<?php
class DB2ConnectionPool {
    private static $connections = [];
    private static $maxConnections = 10;

    public static function getConnection(array $config): ?resource {
        $key = md5(serialize($config));

        if (!isset(self::$connections[$key])) {
            if (count(self::$connections) >= self::$maxConnections) {
                throw new RuntimeException("最大接続数に達しました");
            }

            $conn = db2_connect(
                $config['database'],
                $config['username'],
                $config['password'],
                $config['options'] ?? []
            );

            if ($conn) {
                self::$connections[$key] = $conn;
            }
        }

        return self::$connections[$key] ?? null;
    }

    public static function releaseConnection($key): void {
        if (isset(self::$connections[$key])) {
            db2_close(self::$connections[$key]);
            unset(self::$connections[$key]);
        }
    }
}

4. エラー処理

<?php
function connectWithErrorHandling(array $config): ?resource {
    try {
        $conn = db2_connect(
            $config['database'],
            $config['username'],
            $config['password'],
            $config['options'] ?? []
        );

        if ($conn === false) {
            throw new RuntimeException(
                "DB2接続エラー: " . db2_conn_errormsg()
            );
        }

        return $conn;
    } catch (Exception $e) {
        error_log($e->getMessage());
        return null;
    }
}

5. 便利なユーティリティ関数

接続テスター

<?php
class DB2Tester {
    public static function testConnection(array $config): array {
        $startTime = microtime(true);
        $result = [
            'success' => false,
            'message' => '',
            'time' => 0
        ];

        try {
            $conn = db2_connect(
                $config['database'],
                $config['username'],
                $config['password']
            );

            if ($conn) {
                $result['success'] = true;
                $result['message'] = "接続成功";
                db2_close($conn);
            } else {
                $result['message'] = "接続失敗: " . db2_conn_errormsg();
            }
        } catch (Exception $e) {
            $result['message'] = "エラー: " . $e->getMessage();
        }

        $result['time'] = microtime(true) - $startTime;
        return $result;
    }
}

6. 注意点とTips

  1. 接続文字列の形式
// カタログ接続
$database = "SAMPLE";

// 完全な接続文字列
$database = "DATABASE=SAMPLE;HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP";
  1. パフォーマンス最適化
$options = [
    'DB2_ATTR_CASE' => DB2_CASE_NATURAL,
    'DB2_ATTR_CURSOR' => DB2_SCROLLABLE,
    'DB2_ATTR_ROWCOUNT' => 100
];
  1. セキュリティベストプラクティス
  • 接続情報は環境変数や設定ファイルで管理
  • パスワードは暗号化して保存
  • 最小権限原則に従う

まとめ

db2_connect関数は、PHPからIBM DB2データベースに接続するための基本的な関数です。以下のような用途で活用できます:

  • データベース接続の確立
  • トランザクション管理
  • 接続プーリング
  • エラーハンドリング

適切な接続管理とエラー処理を実装することで、より堅牢なアプリケーションを作ることができます。

ぜひ、みなさんのプロジェクトでも活用してみてください!

タイトルとURLをコピーしました