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

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

作成日: 更新日:

基本的な使い方

changesメソッドは、SQLite3クラスのインスタンスを通じて、直前のデータ操作文(INSERTUPDATEDELETE)によってデータベース内で実際に変更された行の数を取得するメソッドです。このメソッドは、最新のデータ操作がどれだけのレコードに影響を与えたかを確認する際に使用します。

具体的には、INSERT文が実行された場合は挿入された行の数を、UPDATE文が実行された場合は更新された行の数を、DELETE文が実行された場合は削除された行の数を整数値として返します。もし、UPDATE文やDELETE文が特定の条件に基づいて実行され、その条件に合致する行が一つもなかった場合、たとえ構文が正しくても変更された行は0とカウントされます。

このchangesメソッドは、トランザクション内で複数のデータ操作が行われた場合でも、それらの操作によって変更された行の合計数を返します。また、SELECT文のようなデータの参照のみを行う操作や、CREATE TABLEALTER TABLEなどのスキーマ定義文、VACUUMPRAGMAなどの管理コマンドを実行した直後では、常に0を返します。

この機能を利用することで、開発者はデータ操作の成否を検証したり、予期せぬ変更や期待通りの変更が行われたかどうかをプログラム内で確認したりすることが可能になります。例えば、ユーザーからの入力に基づいて特定のレコードを更新した際、実際にその更新が何件のデータに適用されたかを知りたい場合に役立ちます。

構文(syntax)

1<?php
2$db = new SQLite3('my_database.db');
3$db->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');
4$db->exec('INSERT INTO users (name) VALUES ("Alice")');
5$db->exec('UPDATE users SET name = "Bob" WHERE id = 1');
6$affectedRows = $db->changes();
7$db->close();
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

SQLite3::changesメソッドは、最後に実行されたINSERT、UPDATE、DELETE操作によって影響を受けた行数を整数で返します。

サンプルコード

PHP SQLite3::changes で変更件数を取得する

1<?php
2
3/**
4 * SQLite3::changes メソッドの使用例を示します。
5 * このメソッドは、直前の INSERT, UPDATE, DELETE 文によって影響を受けた行数を整数値で返します。
6 * データベースへの変更が何件のレコードに影響を与えたかを確認でき、簡単な変更の記録として利用できます。
7 * システムエンジニアを目指す初心者が、データベース操作の変更結果を数値で把握するのに役立ちます。
8 */
9function demonstrateSqliteChangesExample(): void
10{
11    // データベースファイル名
12    $dbFile = 'my_app_data.db';
13    $db = null; // SQLite3 オブジェクトを初期化
14
15    try {
16        // SQLite3 データベースに接続または新規作成
17        // SQLITE3_OPEN_READWRITE: 読み書きモードで開く
18        // SQLITE3_OPEN_CREATE: データベースファイルが存在しない場合は作成する
19        $db = new SQLite3($dbFile, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
20        echo "データベース '$dbFile' に接続しました。\n";
21
22        // 'products' テーブルが存在しない場合、作成するSQLクエリを実行
23        $db->exec('CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price REAL)');
24        echo "テーブル 'products' の準備ができました。\n";
25
26        // --- INSERT (挿入) 操作の例 ---
27        // 新しい製品レコードを挿入
28        $db->exec("INSERT INTO products (name, price) VALUES ('ノートパソコン', 120000.00)");
29        // 直前のINSERT文で変更された(挿入された)行数を取得
30        $insertedRows = $db->changes();
31        echo "INSERT操作: $insertedRows 件のレコードが挿入されました。\n"; // 通常、1を返す
32
33        $db->exec("INSERT INTO products (name, price) VALUES ('スマートフォン', 85000.00)");
34        $insertedRows = $db->changes();
35        echo "直後のINSERT操作: $insertedRows 件のレコードが挿入されました。\n"; // 通常、1を返す
36
37        // --- UPDATE (更新) 操作の例 ---
38        // 特定の製品の価格を更新
39        $db->exec("UPDATE products SET price = 115000.00 WHERE name = 'ノートパソコン'");
40        // 直前のUPDATE文で変更された(更新された)行数を取得
41        $updatedRows = $db->changes();
42        echo "UPDATE操作: $updatedRows 件のレコードが更新されました。\n"; // 条件に一致した行数
43
44        // 全ての製品の価格を10%値上げする (複数行を更新する例)
45        $db->exec("UPDATE products SET price = price * 1.1");
46        $updatedAllRows = $db->changes();
47        echo "複数行UPDATE操作: $updatedAllRows 件のレコードが更新されました。\n"; // 全レコード数
48
49        // --- DELETE (削除) 操作の例 ---
50        // 特定の製品レコードを削除
51        $db->exec("DELETE FROM products WHERE name = 'スマートフォン'");
52        // 直前のDELETE文で変更された(削除された)行数を取得
53        $deletedRows = $db->changes();
54        echo "DELETE操作: $deletedRows 件のレコードが削除されました。\n"; // 条件に一致した行数
55
56        // 全ての製品レコードを削除 (データベースをクリーンアップする目的)
57        $db->exec("DELETE FROM products");
58        $deletedAllRows = $db->changes();
59        echo "全レコードDELETE操作: $deletedAllRows 件のレコードが削除されました。\n";
60
61    } catch (Exception $e) {
62        // データベース操作中にエラーが発生した場合
63        echo "エラーが発生しました: " . $e->getMessage() . "\n";
64    } finally {
65        // データベース接続が確立されていれば、必ず閉じる
66        if ($db instanceof SQLite3) {
67            $db->close();
68            echo "データベース接続を閉じました。\n";
69        }
70        // サンプル実行後、データベースファイルを削除する場合は以下のコメントを外してください。
71        // if (file_exists($dbFile)) {
72        //     unlink($dbFile);
73        //     echo "データベースファイル '$dbFile' を削除しました。\n";
74        // }
75    }
76}
77
78// 関数を実行して、SQLite3::changes の動作を確認します。
79demonstrateSqliteChangesExample();

PHPのSQLite3::changesメソッドは、直前に実行されたデータベースのINSERT、UPDATE、またはDELETE文によって、具体的に何件のレコードが影響を受けたかを整数値で確認できる便利な機能です。このメソッドは引数を必要とせず、操作によって変更された行数をint型で返します。

サンプルコードでは、まずmy_app_data.dbというSQLiteデータベースに接続し、「products」テーブルを作成する準備をします。 その後、製品データを挿入するINSERT文を実行すると、changes()は挿入されたレコード数である「1」を返します。 次に、特定の製品の価格を更新するUPDATE文を実行すると、changes()はその更新が影響したレコード数を返します。ここでは単一の更新だけでなく、全ての製品の価格を一括で更新した場合の、複数件の変更数も確認できます。 最後に、特定の製品を削除するDELETE文を実行すると、changes()は削除されたレコード数を返します。例えば、全てのレコードを削除した場合は、その時点の全レコード数が返されます。

このようにSQLite3::changesを使用することで、データベース操作が意図通りに機能したか、どれだけのデータに変更が加えられたかを数値で正確に把握できます。これはシステムエンジニアを目指す初心者にとって、データベースの変更管理やデバッグに非常に役立つでしょう。

SQLite3::changes()メソッドは、直前のINSERT、UPDATE、DELETE文によって影響を受けた行数を整数値で返します。連続したデータベース変更操作を行う場合、このメソッドは常に直後の単一SQL文の結果のみを反映するためご注意ください。データを参照するだけのSELECT文や、データベースに変更がない操作の後では0を返します。データベース操作はエラーが発生しやすいため、サンプルコードのようにtry-catch-finally構文でエラーを適切に処理し、データベース接続を必ず閉じる習慣を身につけましょう。これにより、アプリケーションの安定性とリソース管理が向上します。

関連コンテンツ

関連プログラミング言語