【PHP8.x】lastInsertRowIDメソッドの使い方

lastInsertRowIDメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

lastInsertRowIDメソッドは、SQLite3オブジェクトが直近に実行したINSERTクエリによって、新しく挿入された行のIDを取得するメソッドです。このメソッドは、特にデータベースが主キーの値を自動的に生成する設定になっているテーブル(例えば、AUTOINCREMENTキーワードが指定されたカラムを持つテーブルなど)にデータを挿入した後、その自動生成されたIDをPHPコード側で把握したい場合に非常に有用です。

具体的には、SQLite3オブジェクトに対してINSERT文を実行し、その操作が成功した直後にこのlastInsertRowIDメソッドを呼び出すことで、挿入された新しい行の一意の識別子(通常は主キーの値)を整数として取得できます。例えば、Webアプリケーションでユーザー登録を行う際に、ユーザー情報をデータベースに保存した後、自動生成されたユーザーIDを使って関連する設定情報テーブルにデータを追加したり、ユーザー固有のプロフィールページURLを生成したりするなどの、後続処理にこのIDを利用することが一般的です。

もし直前にINSERTクエリが実行されていない場合や、INSERTクエリが失敗した場合、あるいはIDが自動的に生成されない形式のINSERTクエリだった場合には、このメソッドは通常0を返します。したがって、このメソッドはデータベースに新しく追加されたデータの識別子をプログラムで正確に管理するための、基本的ながら不可欠な機能の一つです。

構文(syntax)

1<?php
2$db = new SQLite3('my_database.db');
3
4$db->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)');
5
6$db->exec("INSERT INTO users (name) VALUES ('Alice')");
7$rowId = $db->lastInsertRowID();
8echo "挿入された行ID: " . $rowId . "\n";
9
10$db->close();
11?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

SQLite3::lastInsertRowID メソッドは、直前に実行された INSERT 文によって挿入された行の ID を整数(int)で返します。

サンプルコード

PHP SQLite lastInsertRowIDでIDを取得する

1<?php
2
3/**
4 * SQLite3::lastInsertRowID メソッドの使用例を示します。
5 * 最後に挿入された行のIDを取得する方法をデモンストレーションします。
6 */
7function demonstrateLastInsertRowID(): void
8{
9    // データベースファイル名を定義
10    $dbFile = 'my_sample_database.db';
11
12    // 既存のデータベースファイルがあれば削除し、クリーンな状態から開始します。(テスト用途)
13    if (file_exists($dbFile)) {
14        unlink($dbFile);
15    }
16
17    $db = null; // SQLite3 オブジェクトの初期化
18
19    try {
20        // 1. SQLite3 データベースに接続または新規作成
21        // データベースファイルが存在しない場合は新規作成されます。
22        $db = new SQLite3($dbFile);
23        echo "データベース '{$dbFile}' に接続しました。\n";
24
25        // 2. 'users' テーブルを作成
26        // id は INTEGER PRIMARY KEY AUTOINCREMENT を指定することで、自動的に増加するIDとなります。
27        $db->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)');
28        echo "テーブル 'users' を作成しました。\n";
29
30        // 3. データを挿入し、直後にその行のIDを取得
31        $userName1 = 'Alice Smith';
32        // SQLインジェクションを防ぐため、文字列はエスケープします。
33        $db->exec("INSERT INTO users (name) VALUES ('" . $db->escapeString($userName1) . "')");
34
35        // lastInsertRowID() は、直前の INSERT 操作で生成された行の ID を返します。
36        $lastId1 = $db->lastInsertRowID();
37        echo "ユーザー '{$userName1}' を挿入しました。最後に挿入された行ID: {$lastId1}\n";
38
39        // 4. 別のデータを挿入し、再度IDを取得
40        $userName2 = 'Bob Johnson';
41        $db->exec("INSERT INTO users (name) VALUES ('" . $db->escapeString($userName2) . "')");
42        $lastId2 = $db->lastInsertRowID();
43        echo "ユーザー '{$userName2}' を挿入しました。最後に挿入された行ID: {$lastId2}\n";
44
45    } catch (Exception $e) {
46        // データベース接続や操作中にエラーが発生した場合、メッセージを表示
47        echo "エラーが発生しました: " . $e->getMessage() . "\n";
48    } finally {
49        // データベース接続が存在すれば閉じる
50        if ($db instanceof SQLite3) {
51            $db->close();
52            echo "データベース接続を閉じました。\n";
53        }
54        // テスト用に作成したデータベースファイルを削除
55        if (file_exists($dbFile)) {
56            unlink($dbFile);
57            echo "データベースファイル '{$dbFile}' を削除しました。\n";
58        }
59    }
60}
61
62// 関数の実行
63demonstrateLastInsertRowID();
64
65?>

PHPのSQLite3::lastInsertRowIDメソッドは、SQLiteデータベースに対して実行された直前のデータ挿入(INSERT文)によって、データベースが自動的に生成した新しい行のID(プライマリキー)を取得するために使用されます。このメソッドは引数を一切必要とせず、直前の挿入操作で割り当てられた整数値のIDをint型で返します。

サンプルコードでは、まずmy_sample_database.dbというSQLiteデータベースファイルを作成または接続し、idカラムが自動的に増加するusersテーブルを定義しています。その後、「Alice Smith」と「Bob Johnson」というユーザー名をテーブルに順次挿入しています。それぞれのINSERT文が実行された直後にlastInsertRowID()メソッドを呼び出すことで、挿入されたばかりの各ユーザーに割り当てられた一意のIDを正確に取得し、その結果を画面に表示しています。

このメソッドは、特にデータベースがAUTOINCREMENTなどの機能を使って自動的にIDを生成する場合に非常に有用です。新しいレコードをプログラムから追加した際、そのレコードのIDをすぐに取得して後続の処理(例えば、そのIDを使って関連データを操作したり、ユーザーに新しいデータの詳細ページへのリンクを提供したりする)に活用したい場合に重宝します。

lastInsertRowIDメソッドは、直前のINSERT操作で自動生成された行のIDを取得する際に使用します。他のSQL操作の後に呼び出すと、期待する結果が得られない場合がありますのでご注意ください。サンプルではSQLインジェクション対策としてescapeStringを使用していますが、セキュリティとパフォーマンスの観点から、SQLite3Stmtを利用したプリペアドステートメントの使用を強く推奨します。データベースへの接続は必ずclose()メソッドで閉じるようにし、try-finallyブロックを活用して、エラー時でも確実にリソースを解放する堅牢なコードを心がけてください。

関連コンテンツ

関連プログラミング言語