【PHP8.x】PDO::FETCH_NUM定数の使い方
FETCH_NUM定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
PDO::FETCH_NUM定数は、PHPのPDO(PHP Data Objects)拡張機能において、データベースから結果セットの行を取得する際のフェッチモードの一つを表す定数です。この定数は、PDOStatementクラスのfetch()やfetchAll()メソッドの引数として指定することで、クエリ結果のデータの取得形式を制御します。
PDO::FETCH_NUMモードが指定されると、データベースから取得された各行のデータは、数値添字の配列として返されます。具体的には、SQLクエリで選択された列が、結果の配列内で0から始まるインデックス(添字)に順番に割り当てられます。例えば、SELECT column1, column2 FROM tableのようなクエリの結果をこのモードで取得した場合、column1の値は配列のインデックス0に、column2の値はインデックス1に格納されます。
このフェッチモードは、特定の列の順序が固定されており、列名ではなくその位置に基づいてデータにアクセスする場合に特に有用です。データベーススキーマの変更が少なく、データの処理速度やメモリ効率を重視するような場面で選択されることがあります。
システムエンジニアを目指す初心者の方々にとっては、データベースからデータを取り出す際に、どのような形式で受け取るかを選択できる重要なオプションの一つとして理解することが大切です。連想配列として取得するPDO::FETCH_ASSOCなど、他のフェッチモードと比較して、状況に応じて最適な取得方法を選択できるように学ぶことが推奨されます。
構文(syntax)
1$result = $statement->fetch(PDO::FETCH_NUM);
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
PDO::FETCH_NUM は、PDOStatement::fetch() や PDOStatement::fetchAll() などのメソッドで、取得する行の形式を指定するための定数です。この定数を指定すると、結果セットの各行は、カラム名をキーとする連想配列ではなく、カラムのインデックスをキーとする数値添え字配列として返されます。
サンプルコード
PHP PDO::FETCH_NUMでデータと行数を取得する
1<?php 2 3/** 4 * PDO::FETCH_NUM 定数を使用してデータベースからデータをフェッチし、 5 * 取得した行数を表示するサンプル関数です。 6 * 7 * PDO::FETCH_NUM は、結果セットの行を0から始まる数値添字の配列として返します。 8 * このサンプルでは、インメモリSQLiteデータベースを使用しているため、 9 * 事前にデータベースサーバーを用意する必要なく、単体で実行できます。 10 * 11 * システムエンジニアを目指す初心者が、PDO::FETCH_NUM の使い方と 12 * フェッチした行数の取得方法を理解するのに役立ちます。 13 */ 14function fetchDataUsingPdoFetchNum(): void 15{ 16 // データベース接続情報 (インメモリSQLiteを使用) 17 // 実際のアプリケーションでは、'mysql:host=localhost;dbname=testdb', 'user', 'password' のようになります。 18 $dsn = 'sqlite::memory:'; 19 20 try { 21 // 1. データベースへの接続 22 // PDO (PHP Data Objects) は、様々なデータベースに一貫した方法でアクセスするための拡張機能です。 23 $pdo = new PDO($dsn); 24 25 // エラーモードを設定: 例外をスローするように設定し、エラーを捕捉しやすくします。 26 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 27 echo "データベースに接続しました。\n\n"; 28 29 // 2. テーブルの作成 (初回実行時のみ) 30 // SQL文を実行して、'users' というテーブルを作成します。 31 $pdo->exec("CREATE TABLE IF NOT EXISTS users ( 32 id INTEGER PRIMARY KEY AUTOINCREMENT, 33 name TEXT NOT NULL, 34 age INTEGER 35 )"); 36 echo "テーブル 'users' を作成しました (既に存在する場合はスキップ)。\n"; 37 38 // 3. サンプルデータの挿入 39 // データをテーブルに挿入します。 40 $pdo->exec("INSERT INTO users (name, age) VALUES ('Alice', 30)"); 41 $pdo->exec("INSERT INTO users (name, age) VALUES ('Bob', 24)"); 42 $pdo->exec("INSERT INTO users (name, age) VALUES ('Charlie', 35)"); 43 echo "サンプルデータを挿入しました。\n\n"; 44 45 // 4. データの取得と PDO::FETCH_NUM の使用 46 // SELECT文を実行し、結果セットを PDOStatement オブジェクトに格納します。 47 $stmt = $pdo->query("SELECT id, name, age FROM users"); 48 49 echo "--- PDO::FETCH_NUM でフェッチした結果 --- \n"; 50 // fetchAll(PDO::FETCH_NUM) を使用して、全ての行を数値添字配列として取得します。 51 // 例: [0 => 1, 1 => 'Alice', 2 => 30] 52 $rows = $stmt->fetchAll(PDO::FETCH_NUM); 53 54 // 取得したデータを表示 55 foreach ($rows as $row) { 56 // $row は数値添字配列なので、カラムにアクセスするにはインデックスを使用します。 57 echo "ID: " . $row[0] . ", 名前: " . $row[1] . ", 年齢: " . $row[2] . "\n"; 58 } 59 60 // 5. 取得した行数の表示 (キーワード「fetch number of rows」に対応) 61 // fetchAll() で取得した配列の要素数を数えることで、フェッチされた行数がわかります。 62 $numberOfRows = count($rows); 63 echo "\nフェッチされた行数: " . $numberOfRows . " 行\n"; 64 65 } catch (PDOException $e) { 66 // PDO関連のエラーが発生した場合の処理 67 echo "データベースエラー: " . $e->getMessage() . "\n"; 68 } catch (Exception $e) { 69 // その他の予期せぬエラーが発生した場合の処理 70 echo "一般エラー: " . $e->getMessage() . "\n"; 71 } 72} 73 74// 関数を実行します。 75fetchDataUsingPdoFetchNum();
このPHPサンプルコードは、データベースアクセスを抽象化するPDO(PHP Data Objects)拡張機能を利用し、PDO::FETCH_NUM定数を使ってデータを取得する方法と、取得した行数を把握する方法をシステムエンジニアを目指す初心者に向け説明しています。PDO::FETCH_NUMは、データベースから取得する結果セットの行を、0から始まる数値添字の配列としてフェッチする際に指定する定数です。この定数自体に引数はなく、その値は整数型(int)です。
コードではまず、手軽に試せるインメモリSQLiteデータベースに接続し、エラーモードを設定しています。次に、usersテーブルを作成し、いくつかのサンプルデータを挿入します。その後、SELECT文でデータを取得し、fetchAll(PDO::FETCH_NUM)メソッドにこの定数を渡すことで、各行が[0 => id, 1 => name, 2 => age]のような数値添字の配列として取得されます。これにより、取得したデータの各カラムには$row[0]のように数値のインデックスでアクセスできます。
キーワードである「フェッチされた行数」については、fetchAll()で取得した結果の配列$rowsの要素数をcount($rows)で数えることで簡単に把握できます。このコードは、PDO::FETCH_NUMの基本的な使い方と、データベースからフェッチしたデータの構造、および行数の取得方法を実践的に理解するのに役立ちます。
このサンプルコードでは、PDO::FETCH_NUMがデータベースの結果を数値添字の配列として返すため、データを取得する際は$row[0]のようにインデックスでアクセスする点に注意してください。実際のアプリケーションでは、データベース接続情報を適切に設定し、セキュリティ対策としてSQLインジェクションを防ぐためのプリペアドステートメント(prepare()とexecute())の使用を強く推奨します。フェッチされた行数は、fetchAll()で取得した配列のcount()で確認できますが、大量のデータを一度に取得するとメモリ消費が大きくなる可能性があります。エラー発生時にはtry-catchで適切に処理する習慣をつけましょう。
PHP PDO FETCH_NUM で数値添字配列取得
1<?php 2 3/** 4 * PDO::FETCH_NUM 定数を使ったデータベースからのデータ取得方法をデモンストレーションします。 5 * 6 * PDO::FETCH_NUM は、結果セットを数値添字の配列としてフェッチするように指定する定数です。 7 * カラム名ではなく、カラムが選択された順番に対応する0から始まるインデックスでデータにアクセスします。 8 */ 9function demonstratePdoFetchNum(): void 10{ 11 // SQLiteのインメモリデータベースを使用 12 // ファイルとして保存したい場合は 'database.sqlite' のように指定 13 $dbPath = ':memory:'; 14 15 try { 16 // 1. PDO オブジェクトを作成し、データベースに接続 17 // データベースの種類とパスを指定 18 $pdo = new PDO("sqlite:$dbPath"); 19 20 // 2. エラーモードを設定 21 // エラー発生時にPDOExceptionをスローするよう設定し、try-catchブロックで捕捉する 22 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 23 24 echo "データベース接続成功。\n\n"; 25 26 // 3. テーブルを作成 27 // IF NOT EXISTS を使用して、テーブルが存在しない場合のみ作成 28 $pdo->exec(" 29 CREATE TABLE IF NOT EXISTS products ( 30 id INTEGER PRIMARY KEY AUTOINCREMENT, 31 name TEXT NOT NULL, 32 price REAL NOT NULL 33 ); 34 "); 35 echo "テーブル 'products' を作成 (または既に存在)。\n"; 36 37 // 4. サンプルデータを挿入 38 // 重複挿入を防ぐためにINSERT OR IGNOREを使用 39 $stmt = $pdo->prepare("INSERT OR IGNORE INTO products (name, price) VALUES (?, ?)"); 40 $stmt->execute(['Laptop', 1200.00]); 41 $stmt->execute(['Mouse', 25.50]); 42 $stmt->execute(['Keyboard', 75.99]); 43 echo "サンプルデータを挿入しました。\n\n"; 44 45 // 5. データを取得するクエリを実行 46 $stmt = $pdo->prepare("SELECT id, name, price FROM products"); 47 $stmt->execute(); 48 49 echo "PDO::FETCH_NUM を使用してデータを取得:\n"; 50 echo "---------------------------------------------------\n"; 51 52 // 6. PDO::FETCH_NUM を指定して結果セットをフェッチ 53 // 各行が、選択されたカラムの順番に対応する数値添字(0, 1, 2...)の配列として返されます。 54 while ($row = $stmt->fetch(PDO::FETCH_NUM)) { 55 // $row は例として ['1', 'Laptop', '1200.0'] のような配列になります。 56 // したがって、$row[0]でid、$row[1]でname、$row[2]でpriceにアクセスできます。 57 echo "ID: {$row[0]}, 製品名: {$row[1]}, 価格: {$row[2]}\n"; 58 echo "内部配列構造: " . json_encode($row, JSON_UNESCAPED_UNICODE) . "\n\n"; 59 } 60 61 echo "---------------------------------------------------\n"; 62 63 } catch (PDOException $e) { 64 // PDO関連のエラーが発生した場合 65 echo "データベースエラーが発生しました: " . $e->getMessage() . "\n"; 66 } catch (Exception $e) { 67 // その他の一般的なエラーが発生した場合 68 echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n"; 69 } finally { 70 // データベース接続を明示的に閉じる (PHPスクリプト終了時に自動的に閉じられますが、明示も可能) 71 $pdo = null; 72 } 73} 74 75// 関数を実行してデモンストレーションを開始 76demonstratePdoFetchNum();
PHPのPDO::FETCH_NUMは、データベースからデータを取得する際に、結果セットを数値添字の配列として受け取るための定数です。引数はなく、戻り値は整数型(int)です。
サンプルコードでは、PHPのPDO拡張機能を使ってSQLiteデータベースに接続し、テーブル作成やデータ挿入といった基本的なデータベース操作を行っています。その後、SELECT文でデータを取得する際に$stmt->fetch(PDO::FETCH_NUM)を指定すると、データベースから返される各行が、SELECT文で指定したカラムの順序に対応する0から始まるインデックス(例:$row[0], $row[1], $row[2])を持つ配列として取得されることを実演しています。例えば、SELECT id, name, price FROM productsの実行結果は、['1', 'Laptop', '1200.0']のような配列形式となります。これは、カラム名ではなく順序でデータにアクセスしたい場合に使う、一般的なデータ取得方法の一つです。
PDO::FETCH_NUMは、データベースから取得したデータを数値添字の配列として返します。そのため、SQLクエリで取得するカラムの順序が変わると、データにアクセスする$row[0]などのインデックスも変更が必要となる点にご注意ください。これは、カラム名でアクセスするPDO::FETCH_ASSOCと比較して、コードの可読性やメンテナンス性が低下しやすい傾向があります。サンプルコードはプリペアドステートメントでSQLインジェクション対策をしていますが、exec()メソッドにユーザーからの入力を含める際は同様にサニタイズなどの対策が必要です。実際のアプリケーションでは、データベース接続情報(例: sqlite::memory:)を本番環境のデータベースに合わせて変更してください。エラーメッセージは開発者向けであり、本番環境ではユーザーに詳細を表示せず、ログに記録するなどセキュリティに配慮しましょう。