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

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

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

作成日: 更新日:

基本的な使い方

PDO::queryメソッドは、PHPのPDO拡張機能において、データベースに対してSQLクエリを実行するメソッドです。このメソッドは、主にSELECT文のように、データベースからデータを取り出す(結果セットを返す)SQL文を実行する際に用いられます。

このメソッドを使用する際には、実行したいSQL文を文字列として直接引数に渡します。例えば、「SELECT * FROM users」のようなSQL文をデータベースに送ることができます。

クエリが正常に実行された場合、PDO::queryメソッドはSQLの結果を操作するためのPDOStatementオブジェクトを返します。このPDOStatementオブジェクトを通じて、fetch()fetchAll()などのメソッドを使用して、取得した結果セットの各行や全ての行を順次、または一括で取得できます。

クエリの実行に失敗した場合、PDOのエラーモード設定によってはfalseを返したり、PDOExceptionをスローしたりします。したがって、データベース操作における予期せぬ問題を適切に処理するためには、例外処理(try-catchブロック)や戻り値の確認によるエラーハンドリングを行うことが重要です。

なお、ユーザーからの入力値を含むクエリを実行する場合や、同じSQL文を異なるパラメータで繰り返し実行する場合には、セキュリティ(SQLインジェクション対策)とパフォーマンスの観点から、PDO::prepare()メソッドとPDOStatement::execute()メソッドを使用することが強く推奨されます。PDO::query()メソッドは、主にユーザー入力を含まない、固定されたシンプルなSQL文の実行に適しています。

構文(syntax)

1<?php
2/** @var PDO $pdoInstance */
3$pdoStatementOrFalse = $pdoInstance->query('SELECT column1, column2 FROM table_name');

引数(parameters)

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

  • string $query: 実行したいSQLクエリを指定する文字列
  • ?int $fetchMode = null: 結果セットの取得モードを指定する整数(例: PDO::FETCH_ASSOC, PDO::FETCH_NUM)。省略可能で、デフォルトはnull(PDOのデフォルトモードが使用される)
  • mixed ...$fetchModeArgs: $fetchModeに依存する追加の引数。例えば、PDO::FETCH_COLUMNモードで列番号を指定する場合などに使用

戻り値(return)

PDOStatement|false

PDOStatementオブジェクト、または処理に失敗した場合はfalseを返します。

サンプルコード

PDO::query メソッドでデータベースからデータを取得する

1<?php
2
3/**
4 * PDO::query メソッドを使用したデータベース操作のサンプル関数。
5 * システムエンジニアを目指す初心者向けに、基本的なデータ取得の流れを示します。
6 * SQLite のインメモリデータベースを使用するため、外部DBは不要で単体で動作します。
7 */
8function executePdoQueryExample(): void
9{
10    // データベース接続情報 (SQLite のインメモリデータベースを使用)
11    // このDSNは、アプリケーションの実行中にのみ存在する一時的なデータベースを作成します。
12    $dsn = 'sqlite::memory:';
13    $username = null; // SQLite ではユーザー名、パスワードは不要です
14    $password = null; // SQLite ではユーザー名、パスワードは不要です
15
16    try {
17        // ① PDO オブジェクトを作成し、データベースに接続します。
18        // 第4引数にはオプションの配列を指定できます。
19        // PDO::ATTR_ERRMODE を PDO::ERRMODE_EXCEPTION に設定することで、
20        // データベースのエラーが発生した際に PDOException をスローするようになります。
21        // これはエラーハンドリングを容易にするため推奨される設定です。
22        // PDO::ATTR_DEFAULT_FETCH_MODE は、結果セットのデフォルトの取得方法を設定します。
23        // PDO::FETCH_ASSOC は、カラム名をキーとする連想配列として結果を取得します。
24        $pdo = new PDO($dsn, $username, $password, [
25            PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
26            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
27        ]);
28
29        echo "データベースに接続しました。\n";
30
31        // ② サンプルテーブルの作成 (結果セットを返さないSQL文には exec() を使用)
32        $createTableSql = "
33            CREATE TABLE IF NOT EXISTS users (
34                id INTEGER PRIMARY KEY AUTOINCREMENT,
35                name TEXT NOT NULL,
36                email TEXT UNIQUE NOT NULL
37            )
38        ";
39        $pdo->exec($createTableSql);
40        echo "テーブル 'users' を作成しました。\n";
41
42        // ③ サンプルデータの挿入 (結果セットを返さないSQL文には exec() を使用)
43        // INSERT OR IGNORE は、既に存在するデータがある場合にエラーにならず挿入をスキップします。
44        $pdo->exec("INSERT OR IGNORE INTO users (name, email) VALUES ('Alice', 'alice@example.com')");
45        $pdo->exec("INSERT OR IGNORE INTO users (name, email) VALUES ('Bob', 'bob@example.com')");
46        $pdo->exec("INSERT OR IGNORE INTO users (name, email) VALUES ('Charlie', 'charlie@example.com')");
47        echo "サンプルデータを挿入しました。\n";
48
49        echo "\n--- PDO::query() メソッドを使用してデータを取得 ---\n";
50
51        // ④ PDO::query() メソッドを使用して SELECT 文を実行します。
52        // query() は、結果セットを返す SQL クエリ (主に SELECT 文) に使用されます。
53        // 戻り値は PDOStatement オブジェクト、またはエラー時に false です。
54        $stmt = $pdo->query("SELECT id, name, email FROM users ORDER BY id ASC");
55
56        // ⑤ 取得した PDOStatement オブジェクトから結果をフェッチ(取得)します。
57        echo "取得したユーザーデータ:\n";
58        // fetch() メソッドは、結果セットから次の行を1行ずつ取得します。
59        // デフォルトのフェッチモード (PDO::FETCH_ASSOC) に従って連想配列で返されます。
60        // 結果行がなくなると false を返します。
61        while ($row = $stmt->fetch()) {
62            echo "ID: {$row['id']}, 名前: {$row['name']}, メール: {$row['email']}\n";
63        }
64
65        echo "\n--- PDO::query() で別のクエリと fetchAll() の例 ---\n";
66
67        // 全てのユーザー名を一度に取得する例
68        $stmt = $pdo->query("SELECT name FROM users");
69        // fetchAll() メソッドは、結果セットの全ての行を配列として一度に取得します。
70        // ここでは PDO::FETCH_COLUMN を指定し、結果の最初のカラム (name) の値のみを配列で取得しています。
71        $allNames = $stmt->fetchAll(PDO::FETCH_COLUMN);
72        echo "全てのユーザー名: " . implode(", ", $allNames) . "\n";
73
74    } catch (PDOException $e) {
75        // データベース接続やクエリ実行中に発生した PDOException を捕捉します。
76        // エラーメッセージを表示し、エラーの種類を把握するのに役立ちます。
77        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
78    } finally {
79        // PDO オブジェクトを NULL に設定することで、データベース接続を明示的に閉じます。
80        // PHP のスクリプト終了時に自動的に閉じられますが、明示的に行うことも良い習慣です。
81        $pdo = null;
82        echo "\nデータベース接続を閉じました。\n";
83    }
84}
85
86// サンプル関数を実行します
87executePdoQueryExample();

PHPのPDO::queryメソッドは、主にデータベースからデータを取得する(SELECT文を実行する)際に使用される重要な機能です。このメソッドは、実行したいSQLクエリ文字列を引数として受け取り、そのクエリの結果を表すPDOStatementオブジェクトを返します。もしクエリの実行に失敗した場合は、戻り値としてfalseが返されますので、エラーハンドリングを適切に行うことが大切です。

サンプルコードでは、まずデータベースへの接続を行い、エラー発生時に例外をスローするよう設定しています。テーブルの作成やデータの挿入のように、結果セットを返さないSQL文にはPDO::exec()メソッドを使用します。一方、ユーザー情報を取得する「SELECT id, name, email FROM users」のような、結果を伴うクエリの実行にPDO::query()メソッドが利用されています。

query()メソッドが返却するPDOStatementオブジェクトからは、fetch()メソッドを繰り返し呼び出すことで、結果セットのデータを1行ずつ連想配列形式などで取得できます。また、fetchAll()メソッドを使えば、結果セットの全データを一度に配列としてまとめて取得することも可能です。データベース操作ではエラーが発生しやすいため、try-catchブロックを用いてPDOExceptionを捕捉し、エラーメッセージを表示する堅牢な実装が推奨されます。

PDO::query()は主にSELECT文など、結果を返すクエリに利用されます。最も重要な注意点は、SQLインジェクションというセキュリティ上の脆弱性を防ぐため、ユーザーからの入力値を直接SQLに含めないことです。 ユーザー入力を含むクエリでは、必ずprepare()execute()メソッドでプレースホルダを使用してください。INSERTUPDATEなど結果を返さないSQL文にはexec()メソッドが適切です。データベースエラーを適切に処理するには、PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTIONに設定し、try-catchブロックでPDOExceptionを捕捉することが強く推奨されます。query()は失敗時にfalseを返すため、戻り値の確認も忘れないでください。

PHP PDO::query でDBデータ取得する

1<?php
2
3/**
4 * PHPのPDO::queryメソッドを使用してデータベースからデータを取得するサンプル関数です。
5 * システムエンジニアを目指す初心者の方にも理解しやすいよう、
6 * 最もシンプルなSELECT文の実行例に焦点を当てています。
7 *
8 * キーワード「php query_string」は、このコンテキストではSQLクエリ文字列を指します。
9 */
10function executeSimpleDbQuery(): void
11{
12    // データベース接続設定
13    // SQLiteのインメモリデータベースを使用するため、ファイルやサーバーは不要で、
14    // このスクリプト単体で動作します。
15    // 実際のアプリケーションでは、MySQLなどの外部データベースに接続します。
16    // 例: 'mysql:host=localhost;dbname=testdb;charset=utf8mb4'
17    $dsn = 'sqlite::memory:'; // インメモリSQLiteデータベース
18    $username = null;         // SQLiteでは不要
19    $password = null;         // SQLiteでは不要
20
21    try {
22        // PDOインスタンスを作成し、データベースに接続します。
23        // エラーモードを例外(Exception)モードに設定し、データベース操作で問題が発生した場合に
24        // PDOExceptionがスローされるようにします。これにより、エラー処理が容易になります。
25        $pdo = new PDO($dsn, $username, $password, [
26            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
27            // 取得した行を連想配列として扱うようにデフォルトフェッチモードを設定します。
28            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
29        ]);
30
31        echo "データベースに接続しました。\n";
32
33        // サンプルテーブルを作成します。
34        // これはPDO::queryの直接の例ではありませんが、データがないとSELECT文の結果が見れないため、
35        // 単体で動作可能なサンプルとして含めています。
36        // PDO::execは、結果セットを返さないSQL文(CREATE, INSERT, UPDATE, DELETEなど)を実行します。
37        $pdo->exec("CREATE TABLE IF NOT EXISTS products (
38            id INTEGER PRIMARY KEY AUTOINCREMENT,
39            name TEXT NOT NULL,
40            price REAL NOT NULL
41        )");
42        echo "productsテーブルを作成または確認しました。\n";
43
44        // サンプルデータを挿入します。
45        $insertCount = $pdo->exec("INSERT INTO products (name, price) VALUES ('りんご', 150.0), ('バナナ', 100.0), ('みかん', 200.0)");
46        echo "{$insertCount}件のサンプルデータを挿入しました。\n";
47
48        echo "\n--- PDO::query メソッドによるデータ取得 ---\n";
49
50        // ここでPDO::queryメソッドを使用します。
51        // 引数: string $query -> 実行したいSQLクエリ文字列 (例: 'SELECT * FROM products')
52        // 戻り値: PDOStatement|false -> クエリが成功した場合はPDOStatementオブジェクト、失敗した場合はfalseを返します。
53        //         ただし、ATTR_ERRMODEをEXCEPTIONに設定している場合、失敗時はfalseではなくPDOExceptionがスローされます。
54        $sqlQueryString = 'SELECT id, name, price FROM products WHERE price >= 150';
55        echo "実行するクエリ (query_string): " . $sqlQueryString . "\n";
56
57        // PDO::queryを呼び出してSQLクエリを実行します。
58        $stmt = $pdo->query($sqlQueryString);
59
60        if ($stmt) {
61            echo "クエリが成功しました。\n";
62
63            // PDOStatementオブジェクトから結果セットをすべて取得します。
64            // fetchAll()は、すべての行を配列として返します。
65            $products = $stmt->fetchAll();
66
67            if (empty($products)) {
68                echo "条件に一致する商品はありませんでした。\n";
69            } else {
70                echo "取得した商品データ:\n";
71                foreach ($products as $product) {
72                    echo "  ID: " . $product['id'] . ", 商品名: " . $product['name'] . ", 価格: " . $product['price'] . "円\n";
73                }
74            }
75        } else {
76            // エラーモードがEXCEPTIONのため、このブロックは通常実行されません。
77            echo "クエリの実行に失敗しました。\n";
78        }
79
80    } catch (PDOException $e) {
81        // データベース接続やクエリ実行で発生した例外を捕捉し、エラーメッセージを表示します。
82        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
83    } finally {
84        // データベース接続はスクリプト終了時に自動的に閉じられますが、
85        // 明示的にnullを設定して接続を解放することも可能です。
86        // $pdo = null;
87        echo "\nスクリプトの実行を終了します。\n";
88    }
89}
90
91// 関数を実行して、データベース操作を開始します。
92executeSimpleDbQuery();

PHPのPDO::queryメソッドは、PHPのPDOクラスに属する機能で、データベースからデータを取得する(主にSELECT文を実行する)際に使用します。

このメソッドは、第一引数に実行したいSQLクエリ文字列(string $query)を受け取ります。サンプルコードで$sqlQueryStringとして示されているように、SELECT * FROM productsといった完全なSQL文を指定します。キーワード「php query_string」は、まさにこの引数に渡すSQLクエリ文字列そのものを指しています。

PDO::queryの戻り値は、クエリが成功した場合はデータベースの結果を扱うPDOStatementオブジェクト、失敗した場合はfalseとなります。ただし、PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTIONに設定している場合、SQL実行エラー時にはPDOExceptionがスローされるため、エラー処理がしやすくなります。

サンプルコードでは、まずPDOインスタンスを作成してデータベースに接続し、エラーモードとデフォルトのデータ取得形式を設定しています。その後、queryメソッドに直接SQLクエリ文字列を渡して実行し、戻り値のPDOStatementオブジェクトからfetchAll()メソッドを使って取得したデータを操作しています。PDO::queryは、シンプルなSQLクエリを手軽に実行し、結果を柔軟に処理できる点が特徴です。

PDO::queryメソッドは、直接SQLクエリ文字列(キーワード「php query_string」が指すもの)を実行します。最大の注意点は、ユーザーからの入力値をこのクエリ文字列に直接結合すると、SQLインジェクションという深刻なセキュリティ脆弱性を招く危険性がある点です。そのため、本番環境では、外部入力を含むクエリには必ずPDO::preparePDOStatement::executeによるプリペアドステートメントを使用し、セキュリティを確保してください。また、結果セットを返さないINSERTUPDATEなどのSQL文にはPDO::execを使用するのが適切です。サンプルコードのようにPDO::ATTR_ERRMODEEXCEPTIONに設定することで、エラー発生時の処理を簡潔にできます。

関連コンテンツ