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

【PHP8.x】Pdo\Sqlite::FETCH_ASSOC定数の使い方

FETCH_ASSOC定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FETCH_ASSOC定数は、PHPのデータベース抽象化レイヤーであるPDO(PHP Data Objects)において、データベースから取得した結果セットの取得モードを指定するために使用される定数です。この定数は、結果の各行を連想配列として返すことを指示します。連想配列では、データベースのカラム名が配列のキーとなり、対応するカラムの値がそのキーに紐づく値として格納されます。

例えば、データベースから「id」と「name」というカラムを持つレコードを取得する際にFETCH_ASSOCを使用すると、各行は['id' => 1, 'name' => 'John Doe']のような形式の配列として得られます。これにより、数値インデックスではなくカラム名を使って直接データにアクセスできるため、コードの可読性が向上し、データの意味がより明確になります。特に、データベースのスキーマに基づいて柔軟にデータを利用したい場合や、取得したデータをそのままWebページの表示などに利用する際に非常に便利です。PDOのfetch()メソッドやfetchAll()メソッドの引数として指定することで、このフェッチモードを適用できます。

構文(syntax)

1<?php
2
3$pdo = new PDO('sqlite::memory:');
4$pdo->exec("CREATE TABLE users (id INTEGER, name TEXT)");
5$pdo->exec("INSERT INTO users (id, name) VALUES (1, 'Alice')");
6
7$stmt = $pdo->query("SELECT * FROM users");
8$result = $stmt->fetch(PDO::FETCH_ASSOC);
9
10// $result は例えば ['id' => 1, 'name' => 'Alice'] のような連想配列になります
11// print_r($result);
12
13?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP PDO::FETCH_ASSOCで連想配列取得

1<?php
2
3// 一時的なSQLiteデータベースファイル名
4$dbFile = 'temp_database.sqlite';
5
6try {
7    // 1. PDO接続の確立
8    // SQLiteデータベースに接続します。ファイルが存在しない場合は新規作成されます。
9    // `sqlite:` はDSN(データソース名)で、SQLiteデータベースへの接続を指定します。
10    $pdo = new PDO('sqlite:' . $dbFile);
11
12    // エラーモードを例外に設定します。
13    // これにより、SQLエラーが発生した場合にPDOExceptionがスローされ、try-catchブロックで捕捉できるようになります。
14    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
15
16    echo "データベースに接続しました。\n";
17
18    // 2. テーブルの作成
19    // もし `users` テーブルが存在しなければ、新しく作成します。
20    $pdo->exec("
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    echo "テーブル 'users' が存在しない場合は作成しました。\n";
28
29    // 3. データの挿入
30    // サンプルデータをテーブルに挿入します。
31    // `INSERT OR IGNORE` を使用することで、メールアドレスが重複するデータは挿入されずにスキップされます。
32    $stmt = $pdo->prepare("INSERT OR IGNORE INTO users (name, email) VALUES (?, ?)");
33    $stmt->execute(['Alice', 'alice@example.com']);
34    $stmt->execute(['Bob', 'bob@example.com']);
35    $stmt->execute(['Charlie', 'charlie@example.com']);
36    echo "サンプルデータを挿入しました (重複は無視)。\n";
37
38    // 4. データのクエリ
39    echo "\n--- PDO::FETCH_ASSOC を使用してデータを取得 ---\n";
40    $stmt = $pdo->query("SELECT id, name, email FROM users");
41
42    // 5. PDO::FETCH_ASSOC を使用して結果を取得し、表示
43    // PDO::FETCH_ASSOC は、データベースから取得した結果の各行を、
44    // カラム名(フィールド名)をキーとする連想配列として返します。
45    // 例えば、`['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com']` のようになります。
46    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
47        echo "ID: " . $row['id'] . ", 名前: " . $row['name'] . ", メール: " . $row['email'] . "\n";
48    }
49    echo "------------------------------------------\n";
50
51} catch (PDOException $e) {
52    // データベース関連のエラーが発生した場合に、エラーメッセージを表示します。
53    echo "データベースエラー: " . $e->getMessage() . "\n";
54} finally {
55    // データベース接続をクローズします。
56    // PHPはスクリプト終了時に自動的に接続を閉じますが、明示的にnullを代入することもできます。
57    $pdo = null;
58
59    // 一時的に作成したデータベースファイルを削除し、クリーンアップします。
60    if (file_exists($dbFile)) {
61        unlink($dbFile);
62        echo "\n一時的なデータベースファイル '{$dbFile}' を削除しました。\n";
63    }
64}

このPHPのサンプルコードは、PHP Data Objects (PDO) 拡張機能を使用してSQLiteデータベースを操作する基本的な手順を示しています。特にPDO::FETCH_ASSOCという定数の使用方法とその役割について詳しく解説しています。

PDO::FETCH_ASSOCは、データベースからデータを取得する際の形式を指定する定数です。この定数自体には引数や戻り値はありませんが、fetchメソッドの引数として使用することで、データベースのクエリ結果がどのような形で返されるかを決定します。具体的には、この定数を指定すると、fetchメソッドは結果セットの各行を、データベースのカラム名(フィールド名)をキーとした連想配列として返します。

例えば、サンプルコードでSELECT id, name, email FROM usersというクエリを実行した場合、$stmt->fetch(PDO::FETCH_ASSOC)['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com']のように、カラム名を直接指定して値にアクセスできる連想配列を返します。これにより、取得したデータの各項目を$row['id']$row['name']のように直感的に利用できます。

このコードでは、まず一時的なSQLiteデータベースファイルを作成し、PDOで接続しています。その後、usersテーブルを作成してサンプルデータを挿入し、最後にPDO::FETCH_ASSOCを使ってデータを取得し、連想配列形式で表示しています。エラーが発生した場合はtry-catchブロックで捕捉し、処理終了後にはデータベース接続のクローズと一時ファイルの削除を行う、堅牢なデータベース操作の基本が学べるコード構成となっています。

PDO::FETCH_ASSOC は、データベースから取得したクエリ結果を、カラム名をキーとする連想配列として扱うための重要な定数です。これにより、$row['カラム名'] のように分かりやすくデータへアクセスできます。

データベース接続では、new PDO でDSN(データソース名)を正確に指定し、PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION に設定してエラー発生時に例外をスローさせることが極めて重要です。これにより、try-catch ブロックで安全にエラーを捕捉し処理できます。

SQLインジェクションを防ぐため、常に prepare()execute() を用いたプリペアドステートメントの利用を心がけてください。変数を直接SQL文字列に埋め込むのは危険です。本番環境では一時ファイルではなく、適切なデータベースパスを指定しましょう。finally ブロックで $pdo = null; として接続を明示的に閉じる習慣も大切です。

PHP PDO::FETCH_ASSOC と FETCH_BOTH の違いを理解する

1<?php
2
3/**
4 * PDOのデータ取得モード(PDO::FETCH_ASSOC, PDO::FETCH_BOTH, PDO::FETCH_NUM)の違いを示すサンプルコードです。
5 * キーワードである "php fetch_assoc vs fetch_array" の理解を深めることを目的としています。
6 * PHP 8 環境で動作し、SQLite インメモリデータベースを使用するため、追加の設定は不要です。
7 *
8 * PDO::FETCH_ASSOC は、PDOStatement::fetch メソッドの引数として使用される定数です。
9 * これは特定のデータベースドライバ(例: SQLite)に限定されず、PDO全般で利用できます。
10 */
11function demonstratePdoFetchModes(): void
12{
13    // 1. メモリ上に一時的なSQLiteデータベースを作成
14    // 'sqlite::memory:' は、スクリプト実行中のみ存在するデータベースを作成します。
15    try {
16        $pdo = new PDO('sqlite::memory:');
17        // エラーが発生した場合にPDOExceptionをスローするよう設定します。
18        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
19
20        // 2. テーブルを作成し、サンプルデータを挿入
21        $pdo->exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)");
22        $pdo->exec("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')");
23        $pdo->exec("INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com')");
24        $pdo->exec("INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com')");
25
26        echo "--- 1. PDO::FETCH_ASSOC の使用例 ---\n";
27        // PDO::FETCH_ASSOC:
28        // 結果セットの行を、カラム名をキーとする連想配列として取得します。
29        // これはMySQLi拡張機能の mysqli_fetch_assoc() メソッドと同じ形式です。
30        $stmtAssoc = $pdo->query("SELECT id, name, email FROM users WHERE name = 'Alice'");
31        $resultAssoc = $stmtAssoc->fetch(PDO::FETCH_ASSOC);
32
33        if ($resultAssoc) {
34            print_r($resultAssoc);
35            echo "  - この形式は、カラム名 ('name', 'email') を直接キーとしてデータにアクセスできるため、可読性が高いです。\n";
36            echo "  - 例: \$resultAssoc['name'] は '" . $resultAssoc['name'] . "' を返します。\n\n";
37        } else {
38            echo "  - データが見つかりませんでした。\n\n";
39        }
40
41        echo "--- 2. PDO::FETCH_BOTH の使用例 (fetch_array に相当する取得形式) ---\n";
42        // PDO::FETCH_BOTH:
43        // 結果セットの行を、数値添字とカラム名キーの両方を持つ配列として取得します。
44        // これはMySQLi拡張機能の mysqli_fetch_array() メソッド(デフォルトモードの MYSQLI_BOTH)と同じ形式です。
45        $stmtBoth = $pdo->query("SELECT id, name, email FROM users WHERE name = 'Bob'");
46        $resultBoth = $stmtBoth->fetch(PDO::FETCH_BOTH);
47
48        if ($resultBoth) {
49            print_r($resultBoth);
50            echo "  - この形式は、カラム名と数値添字の両方でデータにアクセスできます。\n";
51            echo "  - 例: \$resultBoth['name'] は '" . $resultBoth['name'] . "' を、\$resultBoth[1] も '" . $resultBoth[1] . "' を返します。\n\n";
52        } else {
53            echo "  - データが見つかりませんでした。\n\n";
54        }
55
56        echo "--- 3. PDO::FETCH_NUM の使用例 (数値添字配列のみ) ---\n";
57        // PDO::FETCH_NUM:
58        // 結果セットの行を、数値添字配列としてのみ取得します。
59        // これはMySQLi拡張機能の mysqli_fetch_array(MYSQLI_NUM) メソッドと同じ形式です。
60        $stmtNum = $pdo->query("SELECT id, name, email FROM users WHERE name = 'Charlie'");
61        $resultNum = $stmtNum->fetch(PDO::FETCH_NUM);
62
63        if ($resultNum) {
64            print_r($resultNum);
65            echo "  - この形式は、数値添字 (0, 1, 2...) でのみデータにアクセスできます。\n";
66            echo "  - 例: \$resultNum[1] は '" . $resultNum[1] . "' を返しますが、\$resultNum['name'] のようにカラム名でアクセスするとエラーになります。\n\n";
67        } else {
68            echo "  - データが見つかりませんでした。\n\n";
69        }
70
71    } catch (PDOException $e) {
72        // データベース接続やクエリ実行中に発生したエラーを捕捉し、メッセージを表示します。
73        error_log("データベースエラー: " . $e->getMessage());
74        echo "データベース処理中にエラーが発生しました。詳細については、サーバーのログを確認してください。\n";
75    }
76}
77
78// 関数を実行して、各フェッチモードの動作を確認します。
79demonstratePdoFetchModes();

PHP 8のPDO拡張機能におけるPDO::FETCH_ASSOCは、データベースからデータを取得する際の形式を指定する定数です。これはPDOStatement::fetchメソッドの引数として使用され、引数自体は持たず、直接の戻り値もありません。PDO::FETCH_ASSOCを指定すると、データベースから取得した結果セットの各行が、カラム名をキーとする連想配列として返されます。これにより、$row['name']のように、コード上でカラム名を直接使ってデータにアクセスできるため、非常に可読性が高まります。

「php fetch_assoc vs fetch_array」というキーワードに関連して、PDO::FETCH_ASSOCは連想配列のみでデータを取得しますが、PDO::FETCH_BOTHはカラム名と数値添字の両方でアクセスできる配列を返します(これはMySQLi拡張機能のmysqli_fetch_array()のデフォルトモードに相当します)。また、PDO::FETCH_NUMは数値添字のみの配列を返します。このサンプルコードは、SQLiteインメモリデータベースを用いて、これらの異なるデータ取得モードがそれぞれどのような配列構造を生成するかを具体的に示し、その違いを分かりやすく解説しています。

PDO::FETCH_ASSOCは、提供されたリファレンスの「所属クラス」にPdo\Sqliteとありますが、実際にはPDOStatement::fetchメソッドで使用するPHPのPDO拡張機能全般で利用可能な定数です。データベースの種類に関わらず、取得したデータをカラム名をキーとした連想配列形式で扱えるため、コードの可読性が非常に高まります。

キーワードにある「fetch_assoc vs fetch_array」については、PDO::FETCH_ASSOCがMySQLiのmysqli_fetch_assoc()に相当し、カラム名でデータにアクセスします。一方、MySQLiのmysqli_fetch_array()のデフォルトはPDO::FETCH_BOTHに相当し、カラム名と数値添字の両方でデータにアクセスできます。用途に応じてこれらのモードを適切に選択することが重要です。

このサンプルコードはメモリ上のデータベースを使っていますが、実際のアプリケーションでは永続的なデータベースに接続設定が必要です。また、データベース処理では予期せぬエラーに備え、try-catchブロックによる例外処理を必ず行いましょう。

関連コンテンツ