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

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

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

作成日: 更新日:

基本的な使い方

setFetchModeメソッドは、PHPのデータベース拡張機能であるPDOにおいて、SQLクエリの結果からデータを取得する際のフェッチモードを設定するメソッドです。これは、データベースから取得した結果セットを、プログラム内で扱いやすいどのような形式で受け取るかを指定するために用いられます。

具体的には、PDOStatementオブジェクトにこのメソッドを使ってフェッチモードを設定すると、その後に呼び出されるfetch()やfetchAll()メソッドが、設定された形式でデータを返します。例えば、PDO::FETCH_ASSOCを指定すると、結果は列名をキーとする連想配列として取得でき、PDO::FETCH_OBJを指定すると、結果はプロパティとして列名を持つオブジェクトとして取得できます。これにより、データの取得と利用がより効率的かつ直感的になります。

この設定は、対象となるPDOStatementオブジェクトに対して一度行えば、明示的に変更しない限り、以降のデータ取得処理に適用され続けます。メソッドは、設定が成功した場合はブール値のtrueを、失敗した場合はfalseを返します。データベース操作において、データの取り扱い方を柔軟に制御するための基盤となる重要なメソッドです。

構文(syntax)

1<?php
2$stmt->setFetchMode(PDO::FETCH_ASSOC);
3?>

引数(parameters)

int $mode, mixed ...$args

  • int $mode: 取得する行のモードを指定します。PDO::FETCH_ASSOC、PDO::FETCH_NUM、PDO::FETCH_OBJなどが指定可能です。
  • mixed ...$args: $modeで指定されたモードに応じて、追加の引数を可変長で指定します。例えば、PDO::FETCH_COLUMNモードではカラム番号を指定します。

戻り値(return)

bool

このメソッドは、PDOStatement オブジェクトのフェッチモードを設定するために使用されます。成功した場合は true を返し、失敗した場合は false を返します。

サンプルコード

PHP PDO setFetchMode でデータ取得モードを設定する

1<?php
2
3/**
4 * PDOStatement::setFetchMode の使用例を初心者向けに示します。
5 * データベースへの接続、テーブル作成、データ挿入、
6 * そして異なるフェッチモードでのデータ取得を行います。
7 *
8 * この関数は単体で動作し、SQLiteのインメモリデータベースを使用するため、
9 * 外部のデータベースサーバーは不要です。
10 */
11function demonstratePdoSetFetchMode(): void
12{
13    // データベース接続設定
14    // SQLiteのインメモリデータベースを使用し、ファイルシステムへの依存をなくします。
15    // エラーモードを例外に設定し、エラー発生時にPDOExceptionをスローするようにします。
16    try {
17        $pdo = new PDO('sqlite::memory:');
18        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
19        echo "データベースに接続しました。\n\n";
20    } catch (PDOException $e) {
21        // データベース接続に失敗した場合の処理
22        exit("データベース接続エラー: " . $e->getMessage());
23    }
24
25    // サンプルテーブルの作成
26    // IF NOT EXISTS を使用して、複数回実行されてもエラーにならないようにします。
27    $pdo->exec("
28        CREATE TABLE IF NOT EXISTS users (
29            id INTEGER PRIMARY KEY AUTOINCREMENT,
30            name TEXT NOT NULL,
31            email TEXT UNIQUE NOT NULL
32        );
33    ");
34    echo "テーブル 'users' を作成しました。\n\n";
35
36    // サンプルデータの挿入
37    // プリペアドステートメントを使用して、SQLインジェクションを防ぎます。
38    $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
39    $stmt->execute(['Alice', 'alice@example.com']);
40    $stmt->execute(['Bob', 'bob@example.com']);
41    echo "サンプルデータを挿入しました。\n\n";
42
43    // --- PDO::FETCH_ASSOC モードの例 ---
44    // 結果を連想配列(カラム名をキーとする配列)として取得します。
45    echo "--- FETCH_ASSOC モード (連想配列) ---\n";
46    $stmt = $pdo->prepare("SELECT id, name, email FROM users");
47    $stmt->execute();
48
49    // setFetchMode メソッドで取得モードを PDO::FETCH_ASSOC に設定します。
50    // これにより、以降の fetch() は連想配列を返します。
51    $stmt->setFetchMode(PDO::FETCH_ASSOC);
52
53    // データをフェッチし、連想配列として各行の情報を表示します。
54    while ($row = $stmt->fetch()) {
55        echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n";
56    }
57    echo "\n";
58
59    // --- PDO::FETCH_OBJ モードの例 ---
60    // 結果を匿名オブジェクト(プロパティとしてカラム名を持つオブジェクト)として取得します。
61    echo "--- FETCH_OBJ モード (匿名オブジェクト) ---\n";
62    $stmt = $pdo->prepare("SELECT id, name, email FROM users");
63    $stmt->execute();
64
65    // setFetchMode メソッドで取得モードを PDO::FETCH_OBJ に設定します。
66    // これにより、以降の fetch() は匿名オブジェクトを返します。
67    $stmt->setFetchMode(PDO::FETCH_OBJ);
68
69    // データをフェッチし、匿名オブジェクトのプロパティとして各行の情報を表示します。
70    while ($row = $stmt->fetch()) {
71        echo "ID: " . $row->id . ", 名前: " . $row->name . ", メール: " . $row->email . "\n";
72    }
73    echo "\n";
74
75    // --- PDO::FETCH_CLASS モードの例 ---
76    // 結果を指定したクラスのインスタンスとして取得します。
77    // このモードでは setFetchMode の第二引数にクラス名を渡します。
78    echo "--- FETCH_CLASS モード (指定クラスのインスタンス) ---\n";
79
80    // データベースの結果をマッピングするためのクラスを定義
81    // プロパティ名はデータベースのカラム名と一致させる必要があります。
82    // PHP 7.4 以降では型ヒントとデフォルト値 (null) を設定できます。
83    class User
84    {
85        public ?int $id = null;
86        public ?string $name = null;
87        public ?string $email = null;
88
89        // コンストラクタは必須ではありませんが、初期化や追加のロジックに利用できます。
90        // PDO::FETCH_CLASS はプロパティに直接値を設定するため、
91        // コンストラクタが呼び出される前にプロパティが設定されることに注意してください。
92        public function __construct()
93        {
94            // 必要に応じて初期化処理を記述
95        }
96
97        // ユーザー情報を表示するメソッド
98        public function displayUserDetails(): void
99        {
100            echo "ID: {$this->id}, 名前: {$this->name}, メール: {$this->email}\n";
101        }
102    }
103
104    $stmt = $pdo->prepare("SELECT id, name, email FROM users");
105    $stmt->execute();
106
107    // setFetchMode メソッドで取得モードを PDO::FETCH_CLASS に設定し、
108    // 第二引数に User クラスの完全修飾名を指定します。
109    $stmt->setFetchMode(PDO::FETCH_CLASS, User::class);
110
111    // データをフェッチし、Userクラスのインスタンスとして各行の情報を表示します。
112    while ($user = $stmt->fetch()) {
113        // $user は User クラスのインスタンスになります。
114        if ($user instanceof User) { // 安全のため、実際にインスタンスであるか確認
115            $user->displayUserDetails();
116        }
117    }
118    echo "\n";
119
120    echo "PDOStatement::setFetchMode のサンプルコードの実行が完了しました。\n";
121}
122
123// サンプル関数の実行
124demonstratePdoSetFetchMode();

PDOStatement::setFetchModeは、PHPのPDO拡張機能において、データベースのクエリ結果をどのような形式で受け取るかを設定するためのメソッドです。これはPDOStatementクラスのオブジェクトに対して使用され、その後のfetch()メソッドによるデータ取得の挙動を決定します。

第一引数$modeには、PDO::FETCH_ASSOC(カラム名をキーとする連想配列)、PDO::FETCH_OBJ(カラム名をプロパティとする匿名オブジェクト)、PDO::FETCH_CLASS(指定したクラスのインスタンス)など、取得したい形式を示す定数を渡します。特にPDO::FETCH_CLASSモードでは、第二引数...$argsで結果をマッピングする対象となるクラスの名前を指定します。このメソッドは、設定が成功した場合はtrueを、失敗した場合はfalseを返します。

提供されたサンプルコードでは、まずSQLiteのインメモリデータベースに接続し、サンプルデータの準備を行います。その後、setFetchModeメソッドを用いてPDO::FETCH_ASSOCPDO::FETCH_OBJ、そしてPDO::FETCH_CLASSの各モードを順番に適用し、それぞれのモードでデータベースの行がどのような構造のデータ(連想配列、オブジェクト、カスタムクラスのインスタンス)として取得されるかを具体的に示しています。これにより、初心者はデータの取得形式の柔軟性と、それらの利用方法の違いを実践的に学ぶことができます。

PDOStatement::setFetchModeは、一度設定すると、そのステートメントオブジェクトでの以降のfetch()結果の形式を決定します。異なる形式でデータを取り出したい場合は、再度このメソッドで設定を変更するか、fetch()メソッドの引数で一時的に指定してください。特にPDO::FETCH_CLASSモードを使用する際には、指定するクラスのプロパティ名をデータベースのカラム名と完全に一致させる必要があります。また、このモードではクラスのコンストラクタはプロパティに値がセットされた後に実行されるため注意が必要です。データベース接続時のエラーハンドリングとして、PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTIONに設定し、例外処理を行う運用が推奨されます。SQLインジェクション攻撃を防ぐため、プリペアドステートメントを用いたデータ挿入や更新を常に心がけてください。

関連コンテンツ