こんにちは!今回は、DB2データベースのdb2_last_insert_id
関数について、実践的に解説します。この関数は、最後に挿入された行の自動生成IDを取得するのに使用します。
db2_last_insert_idとは?🔍
最後にINSERTされた行の自動生成されたIDを取得する関数です。主にIDENTITY列や自動増分列の値を取得する際に使用します。
基本的な使い方
mixed db2_last_insert_id ( resource $connection )
基本的な使用例
例1:シンプルな使用方法
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$stmt = db2_prepare($connection, $sql);
db2_bind_param($stmt, 1, "山田太郎", DB2_PARAM_IN);
db2_bind_param($stmt, 2, "yamada@example.com", DB2_PARAM_IN);
db2_execute($stmt);
$last_id = db2_last_insert_id($connection);
echo "新しく挿入された行のID: " . $last_id;
実践的な使用例
例1:ユーザー登録システム
class UserRegistration {
private $connection;
public function __construct($connection) {
$this->connection = $connection;
}
public function registerUser($userData) {
try {
$sql = "INSERT INTO users (name, email, password) VALUES (?, ?, ?)";
$stmt = db2_prepare($this->connection, $sql);
db2_bind_param($stmt, 1, $userData['name'], DB2_PARAM_IN);
db2_bind_param($stmt, 2, $userData['email'], DB2_PARAM_IN);
db2_bind_param($stmt, 3, password_hash($userData['password'], PASSWORD_DEFAULT), DB2_PARAM_IN);
if (db2_execute($stmt)) {
$userId = db2_last_insert_id($this->connection);
return [
'success' => true,
'user_id' => $userId,
'message' => '登録成功'
];
}
return ['success' => false, 'message' => '登録失敗'];
} finally {
if (isset($stmt)) {
db2_free_stmt($stmt);
}
}
}
}
例2:注文システム
class OrderSystem {
private $connection;
public function createOrder($customerId, $items) {
try {
db2_autocommit($this->connection, DB2_AUTOCOMMIT_OFF);
// 注文ヘッダーの作成
$sql = "INSERT INTO orders (customer_id, order_date) VALUES (?, CURRENT TIMESTAMP)";
$stmt = db2_prepare($this->connection, $sql);
db2_bind_param($stmt, 1, $customerId, DB2_PARAM_IN);
db2_execute($stmt);
$orderId = db2_last_insert_id($this->connection);
// 注文詳細の作成
foreach ($items as $item) {
$this->createOrderDetail($orderId, $item);
}
db2_commit($this->connection);
return $orderId;
} catch (Exception $e) {
db2_rollback($this->connection);
throw $e;
}
}
private function createOrderDetail($orderId, $item) {
$sql = "INSERT INTO order_details (order_id, product_id, quantity) VALUES (?, ?, ?)";
$stmt = db2_prepare($this->connection, $sql);
db2_bind_param($stmt, 1, $orderId, DB2_PARAM_IN);
db2_bind_param($stmt, 2, $item['product_id'], DB2_PARAM_IN);
db2_bind_param($stmt, 3, $item['quantity'], DB2_PARAM_IN);
return db2_execute($stmt);
}
}
例3:ブログ投稿システム
class BlogPostManager {
private $connection;
public function createPost($title, $content, $authorId) {
$sql = "INSERT INTO blog_posts (title, content, author_id, created_at)
VALUES (?, ?, ?, CURRENT TIMESTAMP)";
$stmt = db2_prepare($this->connection, $sql);
try {
db2_bind_param($stmt, 1, $title, DB2_PARAM_IN);
db2_bind_param($stmt, 2, $content, DB2_PARAM_IN);
db2_bind_param($stmt, 3, $authorId, DB2_PARAM_IN);
if (db2_execute($stmt)) {
$postId = db2_last_insert_id($this->connection);
return [
'post_id' => $postId,
'url' => "/posts/{$postId}"
];
}
return false;
} finally {
db2_free_stmt($stmt);
}
}
}
エラーハンドリング
function safeInsert($connection, $sql, $params) {
try {
$stmt = db2_prepare($connection, $sql);
if (!$stmt) {
throw new Exception("準備されたステートメントの作成に失敗");
}
foreach ($params as $index => $param) {
if (!db2_bind_param($stmt, $index + 1, $param, DB2_PARAM_IN)) {
throw new Exception("パラメータバインドエラー");
}
}
if (!db2_execute($stmt)) {
throw new Exception("実行エラー");
}
$id = db2_last_insert_id($connection);
if ($id === false) {
throw new Exception("IDの取得に失敗");
}
return $id;
} catch (Exception $e) {
error_log("Insert Error: " . $e->getMessage());
return false;
}
}
Tips & 注意点 💡
1. トランザクション内での使用
function createUserWithProfile($connection, $userData) {
try {
db2_autocommit($connection, DB2_AUTOCOMMIT_OFF);
// ユーザー作成
$userId = createUser($connection, $userData);
// プロフィール作成
createProfile($connection, $userId, $userData['profile']);
db2_commit($connection);
return $userId;
} catch (Exception $e) {
db2_rollback($connection);
throw $e;
}
}
2. IDの検証
function validateInsertId($id) {
if ($id === false || $id <= 0) {
throw new Exception("無効なID");
}
return $id;
}
まとめ
db2_last_insert_id
は最後に挿入された行のIDを取得- トランザクション内で安全に使用可能
- エラーハンドリングを適切に実装することが重要
- 関連テーブルの処理に活用できる
適切なID管理で、関連データの整合性を保ちましょう!
Happy Coding! 😊