【PHP8.x】SQLite3::query()メソッドの使い方
queryメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
SQLite3::queryメソッドは、SQLiteデータベースに対してSQLクエリを実行するメソッドです。
このメソッドは、指定されたSQL文をデータベースに送り、その実行結果を扱います。主にSELECT文のように、データベースからデータを取り出す際に使用されますが、データの追加(INSERT)、更新(UPDATE)、削除(DELETE)を行うSQL文も実行できます。例えば、商品の一覧を取得したり、新しいユーザー情報を登録したりする際に利用できます。
queryメソッドにSQLクエリ文字列を渡して実行すると、成功した場合はSQLite3Resultという特別なオブジェクトが返されます。このSQLite3Resultオブジェクトを通じて、取得したデータを行ごとに読み進めたり、各列の値を取り出したりすることができます。これにより、データベースから取得した情報をプログラムで利用できるようになります。
もしSQLクエリの実行中に何らかのエラーが発生した場合は、このメソッドはfalseを返します。そのため、クエリが正しく実行されたかを確認するためには、戻り値がfalseでないかをチェックすることが大切です。
ユーザーからの入力値を含むSQLクエリを実行する際は、セキュリティ上の理由から、直接文字列を結合するのではなく、SQLインジェクションを防ぐために、準備されたステートメント(SQLite3::prepareとSQLite3Stmt::executeの組み合わせ)を使用することを強くお勧めします。
構文(syntax)
1<?php 2$db = new SQLite3('database.sqlite'); 3$sqlQuery = 'SELECT id, name FROM users WHERE status = "active"'; 4$queryResult = $db->query($sqlQuery); 5?>
引数(parameters)
string $query
- string $query: 実行したいSQLクエリ文字列
戻り値(return)
SQLite3Result|false
SQLite3クラスのqueryメソッドは、SQLクエリを実行した結果をSQLite3Resultオブジェクトとして返します。クエリの実行に失敗した場合はfalseを返します。
サンプルコード
PHP SQLite3::query メソッドでデータベース操作をする
1<?php 2 3/** 4 * SQLite3::query メソッドのサンプルコード 5 * 6 * このスクリプトは、SQLiteデータベースに接続し、 7 * テーブルの作成 (DDL)、データの挿入 (DML)、データの取得 (DQL) を行い、 8 * 主に SQLite3::query メソッドの基本的な使い方とその戻り値の処理方法を示します。 9 * システムエンジニアを目指す初心者がデータベース操作の基礎を理解できるよう、 10 * 各ステップにコメントを付けています。 11 */ 12 13// データベースファイル名 14// このファイルはスクリプト実行時にカレントディレクトリに作成されます。 15$dbFile = 'sample_database.db'; 16 17// 既存のデータベースファイルがあれば削除 18// これにより、スクリプトを繰り返し実行しても常にクリーンな状態からテストできます。 19if (file_exists($dbFile)) { 20 unlink($dbFile); 21 echo "既存のデータベースファイル '$dbFile' を削除しました。\n"; 22} 23 24// 1. SQLiteデータベースに接続 25// new SQLite3() コンストラクタは、指定されたデータベースファイルを開きます。 26// ファイルが存在しない場合は、新しく作成されます。 27// 接続に失敗した場合は例外がスローされるため、try-catch ブロックで捕捉します。 28try { 29 $db = new SQLite3($dbFile); 30 echo "データベース '$dbFile' に接続しました。\n"; 31} catch (Exception $e) { 32 // 接続に失敗した場合はエラーメッセージを表示してスクリプトを終了します。 33 die("データベース接続エラー: " . $e->getMessage()); 34} 35 36// 2. テーブルを作成する (DDL: Data Definition Language) 37// 'users' という名前のテーブルを作成します。 38// IF NOT EXISTS は、もしテーブルが既に存在していれば作成しない、という意味です。 39$createTableQuery = " 40 CREATE TABLE IF NOT EXISTS users ( 41 id INTEGER PRIMARY KEY AUTOINCREMENT, 42 name TEXT NOT NULL, 43 email TEXT NOT NULL UNIQUE 44 ); 45"; 46 47// SQLite3::query() メソッドを実行します。 48// CREATE TABLE のような DDL 文の場合、成功すると SQLite3Result オブジェクトが返されますが、 49// 取得するデータは含まれていません。失敗した場合は false が返されます。 50$result = $db->query($createTableQuery); 51 52if ($result === false) { 53 echo "テーブル作成に失敗しました: " . $db->lastErrorMsg() . "\n"; 54 // エラー時はデータベース接続を閉じ、スクリプトを終了します。 55 $db->close(); 56 exit(); 57} 58echo "テーブル 'users' を作成しました。\n"; 59 60// 3. データを挿入する (DML: Data Manipulation Language) 61// 'users' テーブルに新しいユーザーデータを挿入します。 62$insertQuery1 = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');"; 63$insertQuery2 = "INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');"; 64 65// query() メソッドで INSERT 文を実行します。 66// DML 文の場合も、成功すると SQLite3Result オブジェクト(内容は空)、失敗すると false を返します。 67if ($db->query($insertQuery1) === false) { 68 echo "データの挿入に失敗しました (Alice): " . $db->lastErrorMsg() . "\n"; 69} else { 70 echo "データを挿入しました (Alice)。\n"; 71} 72 73if ($db->query($insertQuery2) === false) { 74 echo "データの挿入に失敗しました (Bob): " . $db->lastErrorMsg() . "\n"; 75} else { 76 echo "データを挿入しました (Bob)。\n"; 77} 78 79echo "\n--- ユーザー一覧 ---\n"; 80 81// 4. データを取得する (DQL: Data Query Language) 82// 'users' テーブルからすべてのユーザー情報を取得します。 83$selectQuery = "SELECT id, name, email FROM users;"; 84 85// query() メソッドで SELECT 文を実行します。 86// DQL 文の場合、成功すると結果セットを含む SQLite3Result オブジェクト、失敗すると false を返します。 87$result = $db->query($selectQuery); 88 89if ($result === false) { 90 echo "データの取得に失敗しました: " . $db->lastErrorMsg() . "\n"; 91} else { 92 // 取得したデータを1行ずつ処理し、表示します。 93 // fetchArray(SQLITE3_ASSOC) は、カラム名をキーとする連想配列を1行ずつ返します。 94 // データがなくなると false を返します。 95 while ($row = $result->fetchArray(SQLITE3_ASSOC)) { 96 echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n"; 97 } 98 // 結果セットのリソースを解放します。 99 // 大量のデータを扱う場合や、複数のクエリを実行する場合にメモリ効率を高めるために重要です。 100 $result->finalize(); 101} 102 103// 5. データベース接続を閉じる 104// データベースへの操作が完了したら、必ず接続を閉じましょう。 105// これにより、リソースが解放され、ファイルのロックなどが解除されます。 106$db->close(); 107echo "\nデータベース接続を閉じました。\n"; 108 109?>
SQLite3::queryメソッドは、PHPでSQLiteデータベースに対してSQLクエリを実行するための中心的なメソッドです。引数には実行したいSQL文を文字列形式で渡します。このメソッドは、テーブルの作成(DDL)、データの挿入や更新(DML)、データの取得(DQL)など、あらゆる種類のSQL文に対応しています。
メソッドの戻り値は、実行するSQL文の種類と成否によって異なります。DDL(データ定義言語)やDML(データ操作言語)の文(例: CREATE TABLEやINSERT)を実行した場合、クエリが成功すると中身のないSQLite3Resultオブジェクトが返されます。もしクエリが失敗した場合はfalseが返されるため、必ずこのfalseをチェックしてエラーを適切に処理することが重要です。
特にDQL(データ問い合わせ言語)であるSELECT文を実行した場合、クエリが成功すると、取得した結果セットを含むSQLite3Resultオブジェクトが返されます。このオブジェクトを使って、fetchArrayなどのメソッドで結果を1行ずつ取り出すことができます。クエリが失敗した場合は、DDLやDMLと同様にfalseが返されます。
サンプルコードでは、まずnew SQLite3()でデータベースに接続し、その後queryメソッドを使ってテーブルの作成、データの挿入、データの取得という一連のデータベース操作を行っています。それぞれの操作でqueryメソッドの戻り値をチェックし、エラー発生時に適切な処理を行うことで、安定したデータベース処理の基礎を示しています。最後にclose()メソッドでデータベース接続を閉じることも忘れないようにしましょう。
SQLite3::query()メソッドは、成功時にSQLite3Resultオブジェクト、失敗時にfalseを返します。戻り値は厳密にfalseと比較し、エラー時はlastErrorMsg()で詳細を確認してください。SELECT文でデータを取得した際はfetchArray()で処理後、finalize()でリソースを解放します。データベース操作完了後は、必ずclose()で接続を閉じましょう。ユーザー入力を含むSQL文は、SQLインジェクション防止のためquery()ではなく、プリペアドステートメントの使用を強く推奨します。
PHP SQLite3 queryでDB操作する
1<?php 2 3/** 4 * SQLite3 データベース操作の基本的な例。 5 * システムエンジニアを目指す初心者向けに、SQLite3::query メソッドの使用方法を示す。 6 * このメソッドは、SQLクエリ文字列を受け取り、データベースに対して実行します。 7 */ 8function runSqliteQueryExample(): void 9{ 10 // データベースファイルのパスを定義 11 $dbFile = 'my_database.sqlite'; 12 13 try { 14 // SQLite3 データベースに接続または作成します。 15 // 失敗した場合は SQLite3Exception をスローします。 16 $db = new SQLite3($dbFile); 17 echo "データベース '{$dbFile}' に接続しました。\n"; 18 19 // テーブルが存在しない場合に作成するSQLクエリ文字列を定義 20 $createTableQuery = " 21 CREATE TABLE IF NOT EXISTS users ( 22 id INTEGER PRIMARY KEY AUTOINCREMENT, 23 name TEXT NOT NULL, 24 email TEXT NOT NULL UNIQUE 25 ); 26 "; 27 // SQLite3::query メソッドを使用してテーブル作成クエリを実行します。 28 // 成功時には SQLite3Result オブジェクト、失敗時には false を返します。 29 if (!$db->query($createTableQuery)) { 30 // クエリが失敗した場合、エラーメッセージと共に例外をスローします。 31 throw new Exception("テーブル作成に失敗しました: " . $db->lastErrorMsg()); 32 } 33 echo "テーブル 'users' の準備ができました。\n"; 34 35 // データを挿入するSQLクエリ文字列を定義 36 // 'INSERT OR IGNORE' を使用して、既に存在するデータは挿入しないようにします。 37 $insertDataQuery = " 38 INSERT OR IGNORE INTO users (name, email) VALUES 39 ('Alice', 'alice@example.com'), 40 ('Bob', 'bob@example.com'), 41 ('Charlie', 'charlie@example.com'); 42 "; 43 // SQLite3::query メソッドを使用してデータ挿入クエリを実行します。 44 if (!$db->query($insertDataQuery)) { 45 throw new Exception("データ挿入に失敗しました: " . $db->lastErrorMsg()); 46 } 47 echo "新しいデータを挿入しました(または既に存在していました)。\n"; 48 49 // 全てのユーザーを取得するSQLクエリ文字列を定義 50 $selectDataQuery = "SELECT id, name, email FROM users;"; 51 // SQLite3::query メソッドを使用してデータ選択クエリを実行します。 52 // 成功時には結果セット (SQLite3Result オブジェクト) が返されます。 53 $result = $db->query($selectDataQuery); 54 55 if ($result === false) { 56 // 選択クエリが失敗した場合、エラーメッセージと共に例外をスローします。 57 throw new Exception("データ取得に失敗しました: " . $db->lastErrorMsg()); 58 } 59 60 echo "\n取得したデータ:\n"; 61 // 結果セットをループ処理して、各行のデータを出力します。 62 // SQLITE3_ASSOC は結果を連想配列として返します。 63 while ($row = $result->fetchArray(SQLITE3_ASSOC)) { 64 echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n"; 65 } 66 67 // データベース接続を閉じます。 68 $db->close(); 69 echo "\nデータベース接続を閉じました。\n"; 70 71 } catch (SQLite3Exception $e) { 72 // SQLite3 関連の接続や操作で発生した例外をキャッチします。 73 echo "SQLite エラー: " . $e->getMessage() . "\n"; 74 } catch (Exception $e) { 75 // その他の一般エラーをキャッチします。 76 echo "一般エラー: " . $e->getMessage() . "\n"; 77 } 78} 79 80// サンプル関数を実行して、データベース操作を開始します。 81runSqliteQueryExample();
PHPのSQLite3::queryメソッドは、SQLiteデータベースに対してSQLクエリを実行するために使用します。このメソッドは、引数として実行したいSQLクエリの文字列 $query を受け取ります。クエリが成功した場合、データ選択クエリ(SELECT文)では結果セットを扱うためのSQLite3Resultオブジェクトを返します。INSERTやCREATE TABLEといったデータ操作や定義のクエリでも、成功時にはSQLite3Resultオブジェクトが返されますが、データは含まれません。もしクエリの実行に失敗した場合は false が返されるため、必ずエラーチェックを行うことが重要です。
サンプルコードでは、まず SQLite3 クラスのインスタンスを生成してデータベースファイルに接続します。次に、query メソッドを使って、もし存在しなければ users テーブルを作成し、その後いくつかのユーザーデータを挿入しています。データ挿入には INSERT OR IGNORE を利用し、重複するデータの挿入を避ける工夫も示されています。続いて、SELECT クエリを実行して users テーブルから全データを取得し、返された SQLite3Result オブジェクトから fetchArray メソッドで一行ずつデータを読み出し、画面に表示しています。データベース操作が完了したら、close メソッドで接続を閉じることが推奨されます。try-catch ブロックで例外を適切に処理することで、安定したアプリケーションを開発できます。
SQLite3::queryメソッドは、SQLクエリの実行に失敗するとfalseを返すため、必ず戻り値をチェックし、$db->lastErrorMsg()でエラー詳細を確認することが重要です。このエラーハンドリングを適切に行わないと、問題の原因特定が困難になります。また、サンプルコードではSQLクエリを直接記述していますが、ユーザーからの入力値をクエリに含める際は、SQLインジェクション攻撃を防ぐため、必ずSQLite3::prepareとSQLite3Stmt::bindValueを用いたプリペアドステートメントを利用してください。これはセキュリティ上非常に重要な注意点です。データベースへの接続は、処理が完了したら$db->close()メソッドで確実に閉じるようにしましょう。これはリソース管理の基本です。SELECT以外のクエリでは、返されたSQLite3Resultオブジェクトからデータをフェッチする必要はありません。