[PHP]DB2のdb2_last_insert_idで最後に挿入したIDを取得!実践ガイド

PHP

こんにちは!今回は、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! 😊

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