Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Pdo\Sqlite::commit()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

commitメソッドは、PHPのPdo\Sqliteクラスに属し、現在のトランザクションを終了させ、そのトランザクション内で行われたすべてのデータベース操作の変更を永続的に適用するメソッドです。トランザクションとは、一連のデータベース操作(例えば、データの挿入、更新、削除など)を一つのまとまりとして扱い、すべてが成功するか、すべてが失敗するかを保証する仕組みです。このメソッドは、通常、beginTransactionメソッドで開始されたトランザクションの終了時に呼び出されます。commitが正常に実行されると、beginTransactionからcommitまでの間に実行されたすべての変更がデータベースに恒久的に保存され、外部から参照できるようになります。これにより、複数のデータベース操作が途中段階で半端に適用されることを防ぎ、システム全体のデータの一貫性と信頼性を高めます。データベースの整合性を保つ上で非常に重要な役割を果たします。

構文(syntax)

1<?php
2$pdo = new \PDO('sqlite::memory:');
3$pdo->beginTransaction();
4$pdo->commit();

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

トランザクションのコミットに成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP PDO SQLite トランザクションのコミットとロールバック

1<?php
2
3// データベースファイル名
4// このスクリプトを実行すると 'test.db' というSQLiteデータベースファイルが生成されます。
5$dbFile = 'test.db';
6
7// PDOオブジェクトの初期化
8$pdo = null;
9
10try {
11    // SQLiteデータベースに接続
12    // "sqlite:$dbFile" の形式でSQLiteのデータソース名(DSN)を指定します。
13    // ファイルが存在しない場合は自動的に作成されます。
14    $pdo = new PDO("sqlite:$dbFile");
15
16    // エラー発生時にPDOExceptionをスローするように設定
17    // これにより、SQL実行時のエラーをtry-catchブロックで捕捉できるようになります。
18    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
19
20    echo "データベース接続成功。\n";
21
22    // トランザクションを開始
23    // ここから commit() または rollBack() が呼ばれるまでのデータベース操作は、
24    // 論理的に一つのまとまりとして扱われます。
25    $pdo->beginTransaction();
26    echo "トランザクション開始。\n";
27
28    // テーブルが存在しない場合、'users' テーブルを作成
29    // UNIQUE制約をemailカラムに追加し、重複するメールアドレスの挿入を防ぎます。
30    $pdo->exec("CREATE TABLE IF NOT EXISTS users (
31        id INTEGER PRIMARY KEY AUTOINCREMENT,
32        name TEXT NOT NULL,
33        email TEXT NOT NULL UNIQUE
34    )");
35    echo "テーブル 'users' の存在を確認または作成しました。\n";
36
37    // 挿入するデータ
38    $name1 = '田中 太郎';
39    $email1 = 'tanaka.taro@example.com';
40    $name2 = '山田 花子';
41    $email2 = 'yamada.hanako@example.com';
42
43    // ユーザーデータをプリペアドステートメントを使って挿入
44    // SQLインジェクション攻撃を防ぐため、プリペアドステートメントの使用を推奨します。
45    $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
46
47    // 1人目のユーザーを挿入
48    $stmt->execute([':name' => $name1, ':email' => $email1]);
49    echo "ユーザー '$name1' を挿入しました。\n";
50
51    // 2人目のユーザーを挿入
52    $stmt->execute([':name' => $name2, ':email' => $email2]);
53    echo "ユーザー '$name2' を挿入しました。\n";
54
55    // ===== ロールバックのテストケース(この行のコメントを外すとエラーが発生し、ロールバックされます) =====
56    // $stmt->execute([':name' => '重複テスト', ':email' => 'tanaka.taro@example.com']);
57    // 上の行はemailカラムのUNIQUE制約に違反するため、PDOExceptionが発生します。
58    // この場合、catchブロックに処理が移り、トランザクションはロールバックされます。
59
60    // すべての操作が成功した場合、変更をデータベースに確定(コミット)する
61    // commit()が呼ばれると、トランザクション開始以降のすべての変更が永続化されます。
62    $pdo->commit();
63    echo "トランザクションをコミットしました。変更がデータベースに保存されました。\n";
64
65} catch (PDOException $e) {
66    // PDOException(データベース関連のエラー)が発生した場合
67    echo "エラーが発生しました: " . $e->getMessage() . "\n";
68
69    // トランザクションがアクティブな場合、変更を破棄(ロールバック)する
70    // rollBack()が呼ばれると、トランザクション開始以降のすべての変更が取り消されます。
71    if ($pdo && $pdo->inTransaction()) {
72        $pdo->rollBack();
73        echo "トランザクションをロールバックしました。変更はデータベースに保存されませんでした。\n";
74    }
75} finally {
76    // データベース接続をクローズ
77    // PHPはスクリプト終了時に自動で接続を閉じますが、明示的にnullを代入することもできます。
78    $pdo = null;
79    echo "データベース接続を閉じました。\n";
80}
81
82// データベースの内容を確認するための追加コード (オプション)
83// 上記のトランザクションが成功したか、失敗したかに関わらず、
84// 現在のデータベースの内容を確認するために再度接続してデータを取得します。
85echo "\n--- 現在の 'users' テーブルの内容 ---\n";
86try {
87    $pdo = new PDO("sqlite:$dbFile");
88    $stmt = $pdo->query("SELECT id, name, email FROM users");
89    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
90
91    if (empty($rows)) {
92        echo "テーブルは空です。\n";
93    } else {
94        foreach ($rows as $row) {
95            echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}\n";
96        }
97    }
98} catch (PDOException $e) {
99    echo "データ取得中にエラーが発生しました: " . $e->getMessage() . "\n";
100} finally {
101    $pdo = null;
102    echo "データベース確認接続を閉じました。\n";
103}
104
105?>

Pdo\Sqlite::commitメソッドは、PHPのPDO拡張機能を用いてSQLiteデータベースと連携する際に、トランザクション内で実行された一連のデータベース操作を最終的に確定し、永続化するために使用されます。トランザクションとは、複数のデータベース操作を論理的に一つのまとまりとして扱い、「すべて成功するか、すべて失敗するか」を保証する仕組みです。beginTransaction()でトランザクションを開始し、commit()を呼び出すことで、それまでに実行されたすべての変更がデータベースに保存されます。

このサンプルコードでは、まずSQLiteデータベースに接続し、beginTransaction()でトランザクションを開始しています。その後、usersテーブルの作成と2つのユーザーデータの挿入操作が実行されます。これらの操作がエラーなくすべて完了した場合、$pdo->commit();が呼び出され、これらの変更がデータベースに確定されます。もし何らかのエラー(例えば、重複したメールアドレスの挿入)が発生した場合は、catchブロックで$pdo->rollBack();が実行され、beginTransaction()以降の変更はすべて取り消され、データベースはトランザクション開始前の状態に戻ります。

commitメソッドは引数を必要とせず、操作が成功した場合はtrueを、失敗した場合はfalseをブール値として返します。これにより、データベースの一貫性を保ちながら、信頼性の高いデータ操作を実現できます。

commit()は、beginTransaction()で開始された一連のデータベース変更を確定し、永続化するために使用します。データベース操作は予期せぬエラーが発生しやすいため、必ずtry-catchブロックで囲み、エラー発生時にはrollBack()を呼び出して変更を取り消すようにしましょう。rollBack()を呼び出す前にinTransaction()でトランザクションがアクティブか確認することは、既にコミットまたはロールバック済みのトランザクションを再度操作しようとする不要なエラーを避ける上で重要です。また、SQLインジェクション攻撃を防ぎ、安全にデータを扱うために、データ挿入や更新にはプリペアドステートメントを常に利用してください。これらの注意点を守ることで、安全で堅牢なデータベース処理を実現できます。

PHP PDO SQLite commitでトランザクションを確定する

1<?php
2
3/**
4 * SQLiteデータベースへのトランザクション処理を行い、変更をコミットするサンプル関数です。
5 * システムエンジニアを目指す初心者の方にも、PDO::commit() の基本的な使い方と
6 * トランザクションの重要性を理解してもらえるように設計されています。
7 */
8function handleDatabaseTransactionWithCommit(): void
9{
10    // SQLiteデータベースファイルのパスを定義します。
11    // このファイルはスクリプトと同じディレクトリに作成されます。
12    $databasePath = __DIR__ . '/users.db';
13    $pdo = null; // PDO接続を保持する変数
14
15    try {
16        // 1. データベースに接続します。
17        // DSN (Data Source Name) でSQLiteデータベースファイルを指定します。
18        // PDO::ATTR_ERRMODE を PDO::ERRMODE_EXCEPTION に設定することで、
19        // SQLエラーが発生した場合にPDOExceptionがスローされ、エラーを捕捉しやすくなります。
20        $pdo = new PDO("sqlite:" . $databasePath);
21        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
22        echo "データベース接続に成功しました。\n";
23
24        // 2. トランザクションを開始します。
25        // これ以降のデータベース操作は、すべて「未確定」の状態になります。
26        // すべての操作が成功した場合のみ、後で commit() することで変更が永続化されます。
27        $pdo->beginTransaction();
28        echo "トランザクションを開始しました。\n";
29
30        // 3. 'users' テーブルが存在しない場合に作成します。
31        // CREATE TABLE IF NOT EXISTS は、テーブルが既に存在してもエラーにならない便利な構文です。
32        $pdo->exec("CREATE TABLE IF NOT EXISTS users (
33            id INTEGER PRIMARY KEY AUTOINCREMENT,
34            name TEXT NOT NULL,
35            email TEXT NOT NULL UNIQUE
36        )");
37        echo "テーブル 'users' の準備ができました。\n";
38
39        // 4. データを挿入します。
40        // プリペアドステートメントを使用することで、セキュリティを高め(SQLインジェクション対策)、
41        // 繰り返し同じクエリを実行する際のパフォーマンスも向上します。
42        $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
43
44        // 最初のユーザーを挿入
45        $stmt->execute([':name' => '山田 太郎', ':email' => 'taro.yamada@example.com']);
46        echo "ユーザー '山田 太郎' を挿入しようとしました。\n";
47
48        // 2番目のユーザーを挿入
49        $stmt->execute([':name' => '鈴木 花子', ':email' => 'hanako.suzuki@example.com']);
50        echo "ユーザー '鈴木 花子' を挿入しようとしました。\n";
51
52        // 5. トランザクションをコミットします。
53        // beginTransaction() 以降に行われたすべての変更をデータベースに永続的に保存します。
54        // PDO::commit() は成功した場合に true を返しますが、通常は失敗すると例外をスローします。
55        if ($pdo->commit()) {
56            echo "トランザクションが正常にコミットされました。すべての変更がデータベースに保存されました。\n";
57        } else {
58            // このブロックに到達することは稀ですが、commit() が false を返した場合のハンドリングです。
59            echo "トランザクションのコミットに失敗しました(戻り値が false)。\n";
60        }
61
62    } catch (PDOException $e) {
63        // データベース関連のエラー(例:SQL構文エラー、重複キーなど)が発生した場合
64        // トランザクションがアクティブ(beginTransaction() が呼ばれてから commit() または rollBack() が呼ばれていない状態)であれば、
65        // 変更を元に戻します(ロールバック)。
66        if ($pdo && $pdo->inTransaction()) {
67            $pdo->rollBack();
68            echo "エラーが発生したため、トランザクションをロールバックしました。変更は保存されません。\n";
69        }
70        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
71    } catch (Exception $e) {
72        // その他の予期しないエラーが発生した場合
73        if ($pdo && $pdo->inTransaction()) {
74            $pdo->rollBack();
75            echo "予期せぬエラーが発生したため、トランザクションをロールバックしました。変更は保存されません。\n";
76        }
77        echo "一般的なエラーが発生しました: " . $e->getMessage() . "\n";
78    } finally {
79        // データベース接続を閉じる(スクリプト終了時に自動的に閉じられますが、明示的にnullに設定することも可能です)
80        $pdo = null;
81        echo "データベース接続を閉じました。\n";
82    }
83}
84
85// サンプル関数を実行します。
86handleDatabaseTransactionWithCommit();
87
88?>

このPHPサンプルコードは、SQLiteデータベースにおいて複数の操作をひとまとまりとして扱う「トランザクション」の処理と、その変更をデータベースに確定させるPDO::commit()メソッドの使い方を実演しています。PDO::commit()は、PDO::beginTransaction()で開始された一連のデータベース操作がすべて成功した場合に、それらの変更を永続的にデータベースに保存するために呼び出されます。これにより、例えば複数のデータを同時に挿入する際に、途中でエラーが発生すればすべての操作を取り消し(ロールバックし)、データの一貫性を保つことができます。

このメソッドは引数を何も取りません。戻り値はbool型で、トランザクションのコミットが成功した場合はtrueを、失敗した場合はfalseを返します。ただし、一般的にはコミットが失敗するとPDOExceptionがスローされるため、戻り値がfalseとなるケースは稀です。サンプルコードでは、データベース接続、テーブル作成、ユーザーデータの挿入という一連の処理が問題なく完了した後にPDO::commit()が実行され、これらの変更が最終的にデータベースに反映される様子を示しています。エラーが発生した場合のrollBack()処理と合わせて、システムの信頼性を高める上で非常に重要な機能です。

PDO::commit() は、beginTransaction() で開始した一連のデータベース操作を永続的に確定させるメソッドです。複数の変更をひとまとまりとして扱い、すべて成功した場合のみ commit() で保存します。途中でエラーが発生した際は、必ず rollBack() を呼び出して変更を破棄し、データベースの整合性を保ってください。サンプルコードのように try-catchPDO::ERRMODE_EXCEPTION を用いた適切なエラーハンドリングが不可欠です。また、セキュリティ確保のため、データ挿入にはプリペアドステートメントを常に利用することを強く推奨します。

関連コンテンツ