こんにちは!今回は、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
- 接続文字列の形式
// カタログ接続
$database = "SAMPLE";
// 完全な接続文字列
$database = "DATABASE=SAMPLE;HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP";
- パフォーマンス最適化
$options = [
'DB2_ATTR_CASE' => DB2_CASE_NATURAL,
'DB2_ATTR_CURSOR' => DB2_SCROLLABLE,
'DB2_ATTR_ROWCOUNT' => 100
];
- セキュリティベストプラクティス
- 接続情報は環境変数や設定ファイルで管理
- パスワードは暗号化して保存
- 最小権限原則に従う
まとめ
db2_connect関数は、PHPからIBM DB2データベースに接続するための基本的な関数です。以下のような用途で活用できます:
- データベース接続の確立
- トランザクション管理
- 接続プーリング
- エラーハンドリング
適切な接続管理とエラー処理を実装することで、より堅牢なアプリケーションを作ることができます。
ぜひ、みなさんのプロジェクトでも活用してみてください!