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

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

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

作成日: 更新日:

基本的な使い方

queryメソッドは、Pdo\Sqliteクラスのインスタンスを通じて、SQLiteデータベースに対して直接SQL文を実行するメソッドです。このメソッドは、特に結果セットを伴うSELECT文のようなSQLクエリを実行する際に利用されます。実行したいSQL文を文字列として引数に渡すと、そのSQL文はデータベースに送信され、直ちに実行されます。

SQL文の実行が成功すると、PDOStatementオブジェクトが戻り値として返されます。このPDOStatementオブジェクトは、クエリの結果セットを表し、fetchfetchAllといったメソッドを用いることで、データベースから取得したデータを行ごとに、あるいは全てまとめて処理することが可能になります。

queryメソッドの大きな特徴は、SQL文の準備(プリペア)と実行(エグゼキュート)を一度に行う点にあります。このため、SQL文の中にプレースホルダーを記述し、パラメータを後から安全にバインドするプリペアドステートメントの機能は利用できません。

したがって、このメソッドをユーザー入力など動的な値を含むSQL文の実行に使用する際には、セキュリティ上の注意が必要です。ユーザーからの入力値を直接SQL文に連結すると、悪意のあるSQLインジェクション攻撃を受けるリスクが高まります。安全なデータベース操作のためには、ユーザー入力を扱う場合には、prepareメソッドとexecuteメソッドを用いたプリペアドステートメントを使用し、パラメータバインディングによって値を安全に渡すことが強く推奨されます。

queryメソッドは、アプリケーション内部で固定されたSQL文や、ユーザーからの入力を一切受け付けない、比較的単純なデータベース操作に特に適しています。PHP 8以降では、データベース操作中にエラーが発生した場合、デフォルトでPDOExceptionがスローされるため、エラーハンドリングを行う際は例外処理を考慮する必要があります。

構文(syntax)

1<?php
2// SQLiteデータベースへの接続を確立
3// Pdo\SqliteドライバはPDOクラスを通じて利用されます
4$pdo = new PDO('sqlite::memory:');
5
6// SQLクエリを実行し、PDOStatementオブジェクトを取得
7// queryメソッドは、引数にSQL文字列を取り、結果としてPDOStatementまたはfalseを返します
8$statement = $pdo->query('SELECT "Hello PHP" AS message');
9?>

引数(parameters)

string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs

  • string $query: 実行するSQLクエリ文字列
  • ?int $fetchMode = null: 結果セットの行を取得する際のモード(PDO::FETCH_*定数)。省略した場合、デフォルトのモードが使用されます。
  • mixed ...$fetchModeArgs: $fetchModeに指定されたモードに追加で渡す引数

戻り値(return)

PDOStatement|false

このメソッドは、SQLiteデータベースに対してSQLクエリを実行します。クエリが成功した場合はPDOStatementオブジェクトを返しますが、失敗した場合はfalseを返します。

サンプルコード

PHP PDO::queryでSQLiteデータベースを操作する

1<?php
2
3/**
4 * PDO\Sqlite::query メソッドのサンプルコード
5 *
6 * この関数は、SQLite インメモリデータベースに接続し、
7 * テーブルの作成、データの挿入、データの選択を
8 * PDO::query メソッドを使用して実行する方法を示します。
9 *
10 * システムエンジニアを目指す初心者向けに、基本的なデータベース操作と
11 * エラーハンドリングの例を含んでいます。
12 */
13function runPdoQueryExample(): void
14{
15    // データベース接続オブジェクトを格納する変数
16    $pdo = null;
17
18    try {
19        // SQLite インメモリデータベースに接続
20        // :memory: はファイルを作成せず、スクリプト実行中のみ存在するデータベースです。
21        // PDO::ATTR_ERRMODE を PDO::ERRMODE_EXCEPTION に設定することで、
22        // データベース操作でエラーが発生した場合にPDOExceptionをスローさせます。
23        $pdo = new PDO('sqlite::memory:', null, null, [
24            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
25            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // デフォルトのフェッチモードを設定
26        ]);
27
28        echo "データベースに接続しました (SQLite インメモリ)。\n\n";
29
30        // 1. テーブルを作成する
31        // DDL (データ定義言語) 文も query メソッドで実行できます。
32        $createTableSql = "
33            CREATE TABLE IF NOT EXISTS users (
34                id INTEGER PRIMARY KEY AUTOINCREMENT,
35                name TEXT NOT NULL,
36                email TEXT NOT NULL UNIQUE
37            );
38        ";
39        $pdo->query($createTableSql);
40        echo "テーブル 'users' を作成しました。\n\n";
41
42        // 2. データを挿入する
43        // DML (データ操作言語) 文も query メソッドで実行できます。
44        // ただし、ユーザー入力を含む場合はプリペアドステートメント (prepare/execute) を使用し、
45        // SQLインジェクションを防ぐことを強く推奨します。
46        $pdo->query("INSERT INTO users (name, email) VALUES ('Alice Smith', 'alice@example.com')");
47        $pdo->query("INSERT INTO users (name, email) VALUES ('Bob Johnson', 'bob@example.com')");
48        echo "データを挿入しました。\n\n";
49
50        // 3. データを取得する (query メソッドの主な利用例)
51        // SELECT 文を実行し、結果を PDOStatement オブジェクトとして取得します。
52        // query メソッドの第2引数でフェッチモードを指定できます。
53        // PDO::FETCH_ASSOC は、結果を連想配列として取得します。
54        $stmt = $pdo->query("SELECT id, name, email FROM users", PDO::FETCH_ASSOC);
55
56        echo "--- ユーザーリスト ---\n";
57        if ($stmt) {
58            // PDOStatement オブジェクトをループして結果セットを一行ずつ取得し、表示します。
59            foreach ($stmt as $row) {
60                echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n";
61            }
62        } else {
63            // エラーモードが ERRMODE_EXCEPTION の場合、通常このブロックには到達しません。
64            // エラーはPDOExceptionとして捕捉されます。
65            echo "データの取得に失敗しました。\n";
66        }
67        echo "--------------------\n\n";
68
69    } catch (PDOException $e) {
70        // PDO関連のエラー (例: データベース接続失敗、SQL構文エラーなど) を捕捉します。
71        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
72    } catch (Exception $e) {
73        // その他の予期せぬエラーを捕捉します。
74        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
75    } finally {
76        // データベース接続はスクリプト終了時に自動的に閉じられますが、
77        // 明示的に null を代入してリソースを解放することも可能です。
78        $pdo = null;
79        echo "データベース接続を閉じました。\n";
80    }
81}
82
83// サンプル関数を実行
84runPdoQueryExample();

PHPのPDO::queryメソッドは、データベースに対してSQLクエリを直接実行するための機能です。主に、データベースからデータを取得するSELECT文や、テーブル作成、データの挿入・更新・削除などのDDL/DML文を実行する際に利用されます。

引数としては、まず実行したいSQL文を文字列で指定します(string $query)。次に、取得した結果をどのような形式で扱うかを指定するフェッチモード(?int $fetchMode = null)を指定でき、これにより連想配列や数値添字配列などで結果を得られます。追加の引数(mixed ...$fetchModeArgs)も利用可能です。

メソッドが成功すると、結果セットを扱うためのPDOStatementオブジェクトが返されます。失敗した場合はfalseが返されますが、PDOの接続設定でエラーモードがPDO::ERRMODE_EXCEPTIONに設定されている場合、エラー時には例外(PDOException)がスローされます。

提供されたサンプルコードでは、SQLiteのインメモリデータベースに接続し、エラー発生時に例外をスローする設定を行っています。次にqueryメソッドを使ってusersテーブルを作成し、データを挿入しています。そして、SELECT文でデータを取得し、返されたPDOStatementオブジェクトをforeachループで処理して、ユーザー情報を表示しています。

重要な点として、queryメソッドはSQL文を直接実行するため、ユーザーからの入力値をSQL文に含める際には、SQLインジェクションというセキュリティ上のリスクがあります。このため、ユーザー入力を含むような動的なSQL文を実行する場合には、通常、PDO::preparePDOStatement::executeメソッドを使った「プリペアドステートメント」を利用することが強く推奨されます。

PDO::queryメソッドは、SQLクエリを直接実行する便利な方法ですが、ユーザーからの動的な値を含むSQL文には絶対に使用しないでください。SQLインジェクションのリスクがあるため、そのような場合は必ずPDO::prepareexecuteメソッドを使ったプリペアドステートメントを利用し、セキュリティを確保することが最重要です。主に固定のSELECT文や、データの変更がないDDL文に適しています。エラー発生時にはPDO::ERRMODE_EXCEPTIONを設定することでPDOExceptionとして捕捉できるため、適切なエラーハンドリングを実装してください。また、SELECT文ではPDOStatementオブジェクトが返されるため、そのオブジェクトを介して結果を取得します。

PHP PDO::queryでSQLiteクエリを実行する

1<?php
2
3/**
4 * SQLiteデータベースに対してSQLクエリを実行し、結果を表示します。
5 *
6 * この関数は、PDO (PHP Data Objects) を使用してSQLiteインメモリデータベースに接続し、
7 * テーブルの作成、データの挿入、そしてPdo\Sqliteのqueryメソッドを使ったデータ取得の
8 * 一連の流れを示します。特に、SQLクエリ文字列(キーワード: php query_string)を
9 * データベースに送信する方法に焦点を当てています。
10 *
11 * @return void
12 */
13function executeSqliteQuery(): void
14{
15    // SQLiteデータベースのDSN (Data Source Name) を定義します。
16    // ':memory:' を指定することで、一時的なインメモリデータベースが作成され、
17    // スクリプト終了時に自動的に破棄されるため、ファイルシステムに影響を与えません。
18    $dsn = 'sqlite::memory:';
19
20    try {
21        // PDO (PHP Data Objects) オブジェクトを作成し、データベースに接続します。
22        // エラーモードをPDO::ERRMODE_EXCEPTIONに設定することで、
23        // データベース操作でエラーが発生した場合にPDOExceptionがスローされ、
24        // try-catchブロックで捕捉できるようになります。
25        $pdo = new PDO($dsn);
26        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
27
28        echo "SQLiteインメモリデータベースに接続しました。\n";
29
30        // 1. テーブルを作成するSQLクエリ文字列
31        // query() メソッドは、SELECT, INSERT, UPDATE, DELETE, DDL (CREATE TABLEなど) など
32        // どのようなSQLクエリ文字列でも実行できますが、
33        // 主に結果セットを返さないDDLや、パラメータを含まないシンプルなクエリに使用されます。
34        $createTableSql = "
35            CREATE TABLE IF NOT EXISTS users (
36                id INTEGER PRIMARY KEY AUTOINCREMENT,
37                name TEXT NOT NULL,
38                email TEXT NOT NULL UNIQUE
39            );
40        ";
41        $pdo->query($createTableSql); // SQLクエリを実行
42        echo "テーブル 'users' を作成しました(存在しない場合)。\n";
43
44        // 2. サンプルデータを挿入するSQLクエリ文字列
45        // 'OR IGNORE' は、もし同じメールアドレスのユーザーが既に存在してもエラーにせず無視します。
46        $insertDataSql = "
47            INSERT OR IGNORE INTO users (name, email) VALUES
48            ('山田 太郎', 'taro.yamada@example.com'),
49            ('鈴木 花子', 'hanako.suzuki@example.com');
50        ";
51        $pdo->query($insertDataSql); // SQLクエリを実行
52        echo "サンプルデータを挿入しました(重複は無視)。\n";
53
54        // 3. データを取得するSQLクエリ文字列 (キーワード: php query_string に最も関連)
55        // SELECT文を実行し、結果セットを返します。
56        $selectDataSql = "SELECT id, name, email FROM users ORDER BY id ASC";
57
58        echo "\nデータベースからデータを取得します:\n";
59
60        // PDO::query() メソッドを使用してSQLクエリを実行します。
61        // このメソッドは、成功した場合にPDOStatementオブジェクトを、
62        // 失敗した場合は false を返します。
63        $statement = $pdo->query($selectDataSql);
64
65        if ($statement instanceof PDOStatement) {
66            // PDOStatementオブジェクトからデータを一行ずつフェッチします。
67            // PDO::FETCH_ASSOC は、結果を列名をキーとする連想配列として取得します。
68            while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
69                echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n";
70            }
71        } else {
72            echo "データの取得クエリの実行に失敗しました。\n";
73        }
74
75    } catch (PDOException $e) {
76        // データベース関連のエラーが発生した場合、PDOExceptionを捕捉します。
77        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
78    } catch (Exception $e) {
79        // その他の予期せぬエラーが発生した場合、Exceptionを捕捉します。
80        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
81    } finally {
82        // データベース接続オブジェクトをnullにすることで、接続を明示的に閉じます。
83        // (PHPスクリプト終了時には自動的に閉じられることが多いですが、明示的が推奨されます)
84        $pdo = null;
85        echo "\nデータベース接続を閉じました。\n";
86    }
87}
88
89// 上記で定義した関数を実行します。
90executeSqliteQuery();

PHPのPDO::queryメソッドは、データベースに対してSQLクエリ文字列を直接実行するための基本的な機能を提供します。これは、Pdo\Sqliteのようなデータベースドライバを通じて、SQLiteデータベースなどへの操作を可能にします。

このメソッドの引数には、実行したいSQLクエリを文字列で指定します。例えば、テーブルを作成するCREATE TABLE文、データを挿入するINSERT文、データを取得するSELECT文などです。キーワードphp query_stringは、まさにこのデータベースに送るSQLクエリ文字列自体を指します。

クエリが成功した場合、メソッドは結果を扱うためのPDOStatementオブジェクトを返します。特にSELECT文を実行した際は、このオブジェクトを使って取得したデータを一行ずつ処理できます。もしクエリの実行に失敗した場合は、falseが戻り値として返されます。

サンプルコードでは、SQLiteのインメモリデータベースに接続し、PDO::queryメソッドを使ってテーブルの作成、データの挿入、そしてデータの取得という一連のデータベース操作を行っています。これにより、システムエンジニアを目指す初心者が、プログラムからデータベースへSQLクエリ文字列を送信し、結果を受け取る基本的な流れを学ぶことができます。

このサンプルコードは、SQLクエリ文字列を直接query()メソッドに渡してデータベース操作を行う方法を示しています。特に注意すべき点は、query()メソッドにユーザーからの入力値を直接組み込むと、SQLインジェクションというセキュリティ上の重大な脆弱性につながる危険性があることです。そのため、実際のアプリケーションでは、通常prepare()メソッドとexecute()メソッドを使い、プレースホルダーを用いたパラメータ化クエリを利用することが強く推奨されます。

query()メソッドは主に、テーブル作成のようなDDL文や、結果セットを返さない操作、または完全に信頼できる固定のSQLクエリに使用すると安全です。また、query()の戻り値は成功時にPDOStatementオブジェクト、失敗時にfalseとなるため、必ずその戻り値を適切にチェックし、エラーがないか確認する習慣をつけましょう。データベース操作におけるエラーは致命的であるため、try-catchブロックでの例外処理とPDO::ERRMODE_EXCEPTIONの設定は、堅牢なシステムを構築するために非常に重要です。

関連コンテンツ