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

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

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

作成日: 更新日:

基本的な使い方

FETCH_UNIQUE定数は、PHPのPdo\Sqlite拡張機能に用意されている定数です。この定数は、データベースからデータを取得する際、特にデータの重複を排除したい場合に利用します。主にPDOStatement::fetch()PDOStatement::fetchAll()メソッドの $fetch_style 引数として、PDO::FETCH_GROUP定数と組み合わせて使用します。

PDO::FETCH_GROUPは、データベースの結果セットを特定のカラムの値でグループ化する機能を提供します。例えば、顧客IDごとに注文履歴をグループ化するといった場面で便利です。ここにFETCH_UNIQUE定数を組み合わせると、グループ化された結果の中から、重複する値を持つ行を自動的に一つにまとめ、ユニークなエントリのみを抽出してくれます。これにより、アプリケーション側で重複データの処理ロジックを記述する手間が省け、コードを簡潔に保てます。

この定数を利用することで、データ取得時のメモリ使用量を削減し、重複データを効率的に扱えるようになります。データベースから取得したデータを整理し、一意な情報のみを利用したい場合に大変役立ちます。

構文(syntax)

1<?php
2$pdo = new PDO('sqlite::memory:');
3$pdo->exec('CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT)');
4$pdo->exec("INSERT INTO products (name) VALUES ('Laptop')");
5$pdo->exec("INSERT INTO products (name) VALUES ('Keyboard')");
6$pdo->exec("INSERT INTO products (name) VALUES ('Laptop')");
7
8$stmt = $pdo->query('SELECT name FROM products');
9$uniqueProducts = $stmt->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_UNIQUE);
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PDO::FETCH_UNIQUEは、SQLクエリの結果セットから、結果セットの最初の列の値をキーとして、各行を連想配列として取得するための整数定数です。

サンプルコード

PHP PDO FETCH_UNIQUE で重複を除外する

1<?php
2
3/**
4 * PDO::FETCH_UNIQUE を使用して、データベースから重複しないデータを取得するサンプル関数。
5 * SQLite インメモリデータベースを使用し、システムエンジニアを目指す初心者にも分かりやすく解説します。
6 */
7function demonstratePdoFetchUnique(): void
8{
9    // SQLite インメモリデータベースへの接続設定
10    // ':memory:' は、データをディスクに保存せず、メモリ上で一時的にデータベースを作成・操作します。
11    $dsn = 'sqlite::memory:';
12
13    try {
14        // PDO (PHP Data Objects) オブジェクトを作成し、データベースに接続します。
15        $pdo = new PDO($dsn);
16
17        // エラーモードを例外に設定することで、データベース操作中にエラーが発生した場合に
18        // PDOException がスローされるようになります。これにより、エラーハンドリングが容易になります。
19        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
20
21        echo "データベース接続に成功しました。\n";
22
23        // 'users' テーブルを作成します。
24        // ID (主キー、自動インクリメント) と名前 (テキスト型、NULL不可) を持ちます。
25        $pdo->exec("
26            CREATE TABLE IF NOT EXISTS users (
27                id INTEGER PRIMARY KEY AUTOINCREMENT,
28                name TEXT NOT NULL
29            );
30        ");
31        echo "テーブル 'users' を作成しました。\n";
32
33        // サンプルデータを挿入します。意図的に重複する名前を含めます。
34        $stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
35        $stmt->execute(['Alice']);
36        $stmt->execute(['Bob']);
37        $stmt->execute(['Alice']); // 重複データ
38        $stmt->execute(['Charlie']);
39        $stmt->execute(['Bob']);   // 重複データ
40        echo "サンプルデータを挿入しました(重複データを含む)。\n";
41
42        echo "\n--- PDO::FETCH_UNIQUE を使用して重複を除外した結果 ---\n";
43
44        // 'users' テーブルから 'name' 列を選択し、名前に基づいて昇順で並べ替えます。
45        $stmt = $pdo->query("SELECT name FROM users ORDER BY name");
46
47        // fetchAll() メソッドに PDO::FETCH_UNIQUE フラグを渡すことで、
48        // 取得される結果から重複する行が自動的に除去されます。
49        // 結果は、各ユニークな値がキーとなる連想配列の形式で返されます。
50        // 注意: PDO::FETCH_UNIQUE は PHP 8 で非推奨となり、PHP 9 で削除される予定です。
51        //       しかし、リファレンス情報が PHP 8 なので、ここではその使用方法を示します。
52        $uniqueNames = $stmt->fetchAll(PDO::FETCH_UNIQUE);
53
54        // 取得したユニークな名前を表示します。
55        foreach ($uniqueNames as $name => $row) {
56            echo " - " . $name . "\n";
57        }
58        echo "\n";
59
60        echo "--- 参考: 通常の fetchAll() で取得した場合 (重複を含む) ---\n";
61        // 重複除去なしの場合と比較するために、再度クエリを実行します。
62        $stmt = $pdo->query("SELECT name FROM users ORDER BY name");
63        // PDO::FETCH_COLUMN を使用すると、指定した列 (ここでは最初の列 'name') の値のみが配列として返されます。
64        $allNames = $stmt->fetchAll(PDO::FETCH_COLUMN);
65        foreach ($allNames as $name) {
66            echo " - " . $name . "\n";
67        }
68
69    } catch (PDOException $e) {
70        // データベース関連のエラーが発生した場合、そのメッセージを表示します。
71        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
72    } catch (Exception $e) {
73        // その他の予期せぬエラーが発生した場合、そのメッセージを表示します。
74        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
75    }
76}
77
78// 関数を実行し、サンプルコードの動作を確認します。
79demonstratePdoFetchUnique();

PHPのPDO::FETCH_UNIQUE定数は、データベースから複数のデータをまとめて取得する際(PDO::fetchAll()メソッドを使用する際)に、結果セット内の重複する行を自動的に除去するための特別な指示です。この定数はPDO::fetchAll()の引数として利用され、内部的にはint型の識別値を持っています。その挙動は、取得された結果の各行において、キーとなる列の値が重複している場合に、そのユニークな値を持つ最初の行だけを保持し、後続の同じ値を持つ行を自動的にスキップするというものです。これにより、プログラム側で重複除去のロジックを別途記述する手間が省けます。

サンプルコードでは、まずSQLiteのインメモリデータベースに「Alice」や「Bob」といった重複する名前を含むデータを意図的に挿入しています。その後、$stmt->fetchAll(PDO::FETCH_UNIQUE)と指定してデータを取得することで、重複していた名前が一つにまとめられ、ユニークな名前のリストが効率的に得られる様子を示しています。取得されたデータは連想配列の形式となり、各ユニークな名前が配列のキーとして設定されます。システムエンジニアを目指す上では、このような定数を使ってデータ処理を簡潔にする方法を知っておくことが役立ちます。なお、このPDO::FETCH_UNIQUEはPHP 8で非推奨となり、PHP 9で削除される予定であるため、将来的な利用には注意が必要です。

PDO::FETCH_UNIQUEはPHP 8で非推奨となり、PHP 9で削除される予定の定数である点に特に注意が必要です。この定数を使うと、データベースから取得した結果セットのうち、重複する行を自動的に除去し、各ユニークな値をキーとする連想配列としてデータを整形します。しかし、将来的なPHPのバージョンアップに対応するためには、この定数の使用は避け、SQLクエリでDISTINCT句を使用するか、取得したデータをPHPのarray_unique関数などで処理する代替手段を検討するようにしてください。本サンプルコードは現在の動作を示しますが、実運用では非推奨機能に依存しない実装が安全です。

関連コンテンツ