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

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

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

作成日: 更新日:

基本的な使い方

SQLite3ResultクラスのcolumnTypeメソッドは、指定されたカラムのデータ型を返します。このメソッドは、クエリ結果セット内の特定カラムのデータ型を調査するために使用されます。具体的には、int columnType ( int $column_number )という形式で定義されており、引数としてカラム番号(0から始まるインデックス)を受け取ります。

戻り値は整数値で、以下のSQLite3定数のいずれかを表します。

  • SQLITE3_INTEGER: カラムが整数型である場合
  • SQLITE3_FLOAT: カラムが浮動小数点数型である場合
  • SQLITE3_TEXT: カラムがテキスト型である場合
  • SQLITE3_BLOB: カラムがBLOB型(バイナリデータ)である場合
  • SQLITE3_NULL: カラムがNULL値である場合

もし指定されたカラム番号が無効な場合(結果セットに存在しないカラム番号を指定した場合)、このメソッドはfalseを返します。

システムエンジニアを目指す初心者の方にとって、このメソッドはデータベースから取得したデータの型をプログラム内で適切に処理するために非常に重要です。例えば、数値として扱うべきカラムがテキスト型で返された場合、データの変換処理が必要になる場合があります。columnTypeメソッドを利用することで、このようなデータ型の不一致を事前に検出し、適切な処理を行うことが可能になります。データベースから取得したデータを安全かつ正確に扱うために、このメソッドの理解は不可欠と言えるでしょう。

構文(syntax)

1SQLite3Result::columnType(int $column_number): int|false

引数(parameters)

int $column

  • int $column: 取得したいカラムのインデックス(0から始まる整数)を指定します

戻り値(return)

int

SQLite3Result::columnTypeメソッドは、結果セットの指定されたカラムのデータ型を示す整数を返します。

サンプルコード

PHP SQLite3Result::columnTypeでカラム型を取得する

1<?php
2
3/**
4 * SQLite3Result::columnType メソッドの使用例。
5 *
6 * このスクリプトは、SQLiteデータベースを作成し、テーブルを作成してデータを挿入し、
7 * SELECT クエリの結果セットから各カラムのデータ型を取得して表示します。
8 * SQLite3Result::columnType は、指定されたカラムのSQLiteデータ型を整数値で返します。
9 *
10 * システムエンジニアを目指す初心者向けに、データベース接続から結果の解放まで、
11 * 単体で動作するように簡潔にまとめています。
12 */
13function demonstrateSQLiteColumnType(): void
14{
15    // 一時的なデータベースファイル名
16    $dbFile = 'my_test_database.db';
17    $db = null; // データベース接続オブジェクトを初期化
18
19    try {
20        // 1. SQLiteデータベースに接続(ファイルが存在しない場合は新規作成)
21        // パーミッションエラーを防ぐため、存在しない場合は作成し、存在すれば開く
22        $db = new SQLite3($dbFile);
23        echo "データベース '$dbFile' に接続しました。\n";
24
25        // 2. テーブルを作成(既に存在する場合は何もしない)
26        $db->exec('CREATE TABLE IF NOT EXISTS products (
27            id INTEGER PRIMARY KEY,
28            name TEXT NOT NULL,
29            price REAL,
30            stock INTEGER
31        )');
32        echo "テーブル 'products' を確認または作成しました。\n";
33
34        // 3. データを挿入(初回実行時のみ挿入されるようにする)
35        $insertStmt = $db->prepare('INSERT INTO products (name, price, stock) VALUES (:name, :price, :stock)');
36        if ($insertStmt) {
37            $insertStmt->bindValue(':name', 'Apple', SQLITE3_TEXT);
38            $insertStmt->bindValue(':price', 1.50, SQLITE3_FLOAT);
39            $insertStmt->bindValue(':stock', 100, SQLITE3_INTEGER);
40            $insertStmt->execute();
41            $insertStmt->bindValue(':name', 'Banana', SQLITE3_TEXT);
42            $insertStmt->bindValue(':price', 0.75, SQLITE3_FLOAT);
43            $insertStmt->bindValue(':stock', 200, SQLITE3_INTEGER);
44            $insertStmt->execute();
45            echo "サンプルデータを挿入しました。\n";
46        }
47
48
49        // 4. SELECT クエリを実行して結果セットを取得
50        $result = $db->query('SELECT id, name, price, stock FROM products LIMIT 1');
51
52        if ($result) {
53            echo "\n--- カラムのデータ型情報 ---\n";
54
55            // 結果セットのカラム数を取得
56            $columnCount = $result->numColumns();
57
58            // 各カラムの情報をループで取得
59            for ($i = 0; $i < $columnCount; $i++) {
60                // カラム名を取得
61                $columnName = $result->columnName($i);
62                // カラムのデータ型を整数値で取得
63                $columnType = $result->columnType($i);
64
65                $typeString = '不明';
66                switch ($columnType) {
67                    case SQLITE3_INTEGER:
68                        $typeString = 'INTEGER';
69                        break;
70                    case SQLITE3_TEXT:
71                        $typeString = 'TEXT';
72                        break;
73                    case SQLITE3_FLOAT:
74                        $typeString = 'REAL (FLOAT)';
75                        break;
76                    case SQLITE3_BLOB:
77                        $typeString = 'BLOB';
78                        break;
79                    case SQLITE3_NULL:
80                        $typeString = 'NULL';
81                        break;
82                }
83                echo "カラム {$i}: 名前='{$columnName}', 型='{$typeString}' (値: {$columnType})\n";
84            }
85
86            // 結果セットを解放
87            $result->finalize();
88            echo "\n結果セットを解放しました。\n";
89        } else {
90            echo "クエリの実行に失敗しました。\n";
91        }
92
93    } catch (Exception $e) {
94        // エラーが発生した場合の処理
95        echo "エラーが発生しました: " . $e->getMessage() . "\n";
96    } finally {
97        // 5. データベース接続を閉じる
98        if ($db) {
99            $db->close();
100            echo "データベース接続を閉じました。\n";
101        }
102        // 6. クリーンアップ: 一時的なデータベースファイルを削除
103        if (file_exists($dbFile)) {
104            unlink($dbFile);
105            echo "データベースファイル '$dbFile' を削除しました。\n";
106        }
107    }
108}
109
110// 関数の実行
111demonstrateSQLiteColumnType();

SQLite3Result::columnTypeメソッドは、PHPでSQLiteデータベースのクエリ結果から、特定のカラムのデータ型を取得するために使用されます。このメソッドは、SQLite3Resultオブジェクトが持つ結果セットに対して呼び出されます。

引数$columnには、データ型を知りたいカラムのインデックス(0から始まる番号)を整数で指定します。例えば、クエリ結果の最初のカラムの型を知りたい場合は0、2番目のカラムであれば1を指定します。

戻り値は、そのカラムのSQLiteデータ型を表す整数値です。この整数値は、SQLITE3_INTEGER(整数)、SQLITE3_TEXT(文字列)、SQLITE3_FLOAT(浮動小数点数)などのPHPが提供するSQLite定数と対応しており、これらの定数と比較することで具体的なデータ型を判別できます。

サンプルコードでは、まずSQLiteデータベースを作成し、テーブルとサンプルデータを準備します。その後、SELECTクエリを実行して結果セットを取得し、その結果セットに対してSQLite3Result::columnTypeメソッドを使用しています。これにより、取得したデータの各カラムがどのような型を持っているかをプログラムで動的に判別し、その情報を分かりやすく表示しています。このメソッドは、データベースのスキーマ情報を動的に取得し、アプリケーションの動作を柔軟にする上で役立ちます。一連の処理として、データベースの接続から結果の解放、ファイルの後処理までを学ぶことができます。

このサンプルコードは、SQLite3Result::columnTypeがSQLiteのカラム型を整数値で返すことを示しています。この整数値は、SQLITE3_INTEGERなどのPHPの定義済み定数と比較して、具体的なデータ型を判別しますので、戻り値の解釈に注意が必要です。データベース操作では、予期せぬエラーに備え、try-catch-finallyブロックによる適切なエラーハンドリングが非常に重要です。また、処理が終わったらSQLite3Result::finalize()で結果セットを、SQLite3::close()でデータベース接続を必ず解放し、リソースリークを防いでください。columnTypeメソッドの引数であるカラムのインデックスは、0から始まることに留意し、指定するカラムが存在するか確認することが大切です。

PHP SQLite3Result columnTypeでカラム型を取得する

1<?php
2
3/**
4 * SQLite3Result::columnType の使用例
5 * データベースのクエリ結果から、指定されたカラムのデータ型を取得します。
6 * システムエンジニアを目指す初心者向けに、基本的なデータベース操作とカラム型取得の流れを示します。
7 */
8
9// データベースファイル名
10$dbFileName = 'example.db';
11
12/**
13 * SQLiteのデータ型コードを人間が理解しやすい文字列に変換するヘルパー関数
14 *
15 * @param int $type SQLite3::SQLITE3_XXX のいずれかの定数
16 * @return string データ型を表す文字列
17 */
18function getColumnTypeName(int $type): string
19{
20    return match ($type) {
21        SQLite3::SQLITE3_INTEGER => 'INTEGER',
22        SQLite3::SQLITE3_FLOAT   => 'REAL (FLOAT)',
23        SQLite3::SQLITE3_TEXT    => 'TEXT',
24        SQLite3::SQLITE3_BLOB    => 'BLOB',
25        SQLite3::SQLITE3_NULL    => 'NULL',
26        default                  => 'UNKNOWN (' . $type . ')',
27    };
28}
29
30// データベースに接続
31// 例外を有効にすることで、エラー発生時にExceptionをキャッチできます。
32try {
33    $db = new SQLite3($dbFileName);
34    $db->enableExceptions(true);
35    echo "データベース '$dbFileName' に接続しました。\n";
36} catch (Exception $e) {
37    echo "データベース接続エラー: " . $e->getMessage() . "\n";
38    exit(1); // エラーが発生した場合はスクリプトを終了
39}
40
41// テーブルを作成(もし存在しない場合)
42// id (INTEGER), name (TEXT), age (INTEGER), score (REAL) のカラムを持つusersテーブル
43$createTableSql = "
44CREATE TABLE IF NOT EXISTS users (
45    id INTEGER PRIMARY KEY AUTOINCREMENT,
46    name TEXT NOT NULL,
47    age INTEGER,
48    score REAL
49);
50";
51try {
52    $db->exec($createTableSql);
53    echo "テーブル 'users' が存在しない場合は作成されました。\n";
54} catch (Exception $e) {
55    echo "テーブル作成エラー: " . $e->getMessage() . "\n";
56    $db->close();
57    exit(1);
58}
59
60// サンプルデータを挿入(テーブルにデータがない場合を想定)
61// 毎回実行されても問題ないように、重複挿入は考慮していません。
62$insertSql = "INSERT INTO users (name, age, score) VALUES ('Alice', 30, 95.5);";
63try {
64    $db->exec($insertSql);
65    echo "サンプルデータが挿入されました。\n";
66} catch (Exception $e) {
67    // データが既に存在する場合など、挿入に失敗しても処理を続行可能
68    echo "データ挿入エラー (データが既に存在する可能性があります): " . $e->getMessage() . "\n";
69}
70
71
72// データをSELECTし、SQLite3Result オブジェクトを取得
73$selectSql = "SELECT id, name, age, score FROM users LIMIT 1;"; // 最初の1レコードを選択
74$results = null; // SQLite3Result オブジェクトを格納する変数
75
76try {
77    $results = $db->query($selectSql);
78
79    // クエリ結果が SQLite3Result オブジェクトであるか確認
80    if ($results instanceof SQLite3Result) {
81        // 結果セットのカラム数を取得
82        $numCols = $results->numColumns();
83        echo "\n--- クエリ結果のカラム情報 ---\n";
84        echo "取得したレコードのカラム数: " . $numCols . "\n";
85
86        // 各カラムの型を取得して表示
87        for ($i = 0; $i < $numCols; $i++) {
88            $columnName = $results->columnName($i); // カラム名 (0から始まるインデックスで指定)
89            $columnType = $results->columnType($i); // カラムのデータ型 (0から始まるインデックスで指定)
90
91            // 型コードを人間が理解しやすい文字列に変換
92            $typeName = getColumnTypeName($columnType);
93
94            echo "  カラム #" . $i . " (名前: '" . $columnName . "'): 型コード " . $columnType . " (" . $typeName . ")\n";
95        }
96
97        // SQLite3Result オブジェクトが保持するリソースを解放
98        $results->finalize();
99    } else {
100        echo "クエリ結果が空または不正です。\n";
101    }
102} catch (Exception $e) {
103    echo "クエリ実行エラー: " . $e->getMessage() . "\n";
104} finally {
105    // データベース接続を閉じる
106    // これを忘れると、データベースファイルがロックされたままになる可能性があります。
107    if (isset($db)) {
108        $db->close();
109        echo "\nデータベース接続が閉じられました。\n";
110    }
111
112    // サンプル用に作成したデータベースファイルを削除する場合 (任意)
113    // unlink($dbFileName);
114    // echo "データベースファイル '$dbFileName' が削除されました。\n";
115}
116?>

PHPのSQLite3Result::columnTypeメソッドは、データベースに対するSQLクエリの実行結果から、指定されたカラムのデータ型コードを取得するために使われます。このメソッドは、SQLite3クラスのqueryメソッドなどで取得できるSQLite3Resultオブジェクトに属しています。

引数には、データ型を知りたいカラムのインデックスをint型で渡します。インデックスは0から始まり、最初のカラムが0、次のカラムが1、といったように指定します。このメソッドの戻り値はint型で、SQLiteが内部的に定義しているデータ型コード(例えば、整数型ならSQLite3::SQLITE3_INTEGERなどの定数)が返されます。

サンプルコードでは、まずSQLiteデータベースに接続し、usersテーブルを作成してサンプルデータを挿入しています。その後、SELECT文を実行して得られたSQLite3Resultオブジェクトから、numColumnsメソッドでカラムの総数を取得します。そして、ループ処理の中でcolumnTypeメソッドを使って各カラムのデータ型コードを取得し、それを分かりやすい文字列に変換して表示しています。これにより、プログラムがデータベースから取得した結果の各カラムが、整数、テキスト、浮動小数点数など、どのデータ型に分類されるかを正確に把握し、その後の処理に活かすことができます。データベースとの接続は、処理の最後に必ず閉じるようにしてください。

SQLite3Result::columnTypeメソッドは、0から始まるインデックスで指定されたカラムのデータ型を整数値で返します。この整数値はSQLite3::SQLITE3_INTEGERのような定数に対応するため、サンプルコードのようにヘルパー関数で分かりやすい文字列に変換すると利用しやすくなります。データベース操作においては、try-catchブロックとSQLite3::enableExceptions(true)を使用して、エラー発生時に適切に例外を捕捉し処理することが重要です。また、クエリ結果のSQLite3Resultオブジェクトは、使い終わったら必ずfinalize()メソッドで内部リソースを解放し、データベース接続もclose()で閉じるようにしてください。これを怠ると、データベースファイルがロックされたままになるなどの問題が発生する可能性があります。

関連コンテンツ

関連IT用語

関連プログラミング言語