[PHP]DB2で結果セットを配列で取得!db2_fetch_arrayの実践的な使い方

PHP

こんにちは!今回は、DB2データベースから取得した結果を配列として扱えるdb2_fetch_array関数について、分かりやすく解説していきます!

db2_fetch_arrayとは?🤔

この関数は、DB2のクエリ結果から1行ずつデータを配列として取得する関数です。数値インデックスと連想配列の両方の形式でデータを取得できます。

基本的な構文

array db2_fetch_array ( resource $stmt [, int $row_number = -1 ] )

基本的な使用例

例1:シンプルな取得方法

$sql = "SELECT * FROM employees";
$stmt = db2_exec($connection, $sql);

while ($row = db2_fetch_array($stmt)) {
    echo "ID: " . $row[0] . "\n";
    echo "名前: " . $row[1] . "\n";
    echo "部署: " . $row[2] . "\n";
    echo "-------------------\n";
}

例2:連想配列として取得

$sql = "SELECT emp_id, name, department FROM employees";
$stmt = db2_exec($connection, $sql);

while ($row = db2_fetch_array($stmt)) {
    print_r($row);
    /* 出力例:
    Array (
        [0] => 1001
        [1] => 山田太郎
        [2] => 営業部
        [EMP_ID] => 1001
        [NAME] => 山田太郎
        [DEPARTMENT] => 営業部
    )
    */
}

実践的な使用例

例1:社員リストの表示

function displayEmployeeList($connection) {
    $sql = "SELECT emp_id, name, department, salary 
            FROM employees 
            ORDER BY department, name";

    $stmt = db2_exec($connection, $sql);
    if (!$stmt) {
        throw new Exception("クエリ実行エラー");
    }

    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>名前</th><th>部署</th><th>給与</th></tr>";

    while ($row = db2_fetch_array($stmt)) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row[0]) . "</td>";
        echo "<td>" . htmlspecialchars($row[1]) . "</td>";
        echo "<td>" . htmlspecialchars($row[2]) . "</td>";
        echo "<td>" . number_format($row[3]) . "円</td>";
        echo "</tr>";
    }

    echo "</table>";
}

例2:データの集計処理

function calculateDepartmentStats($connection) {
    $sql = "SELECT department, salary FROM employees";
    $stmt = db2_exec($connection, $sql);

    $stats = [];
    while ($row = db2_fetch_array($stmt)) {
        $dept = $row[0];
        $salary = $row[1];

        if (!isset($stats[$dept])) {
            $stats[$dept] = [
                'count' => 0,
                'total' => 0,
                'max' => 0,
                'min' => PHP_FLOAT_MAX
            ];
        }

        $stats[$dept]['count']++;
        $stats[$dept]['total'] += $salary;
        $stats[$dept]['max'] = max($stats[$dept]['max'], $salary);
        $stats[$dept]['min'] = min($stats[$dept]['min'], $salary);
    }

    return $stats;
}

例3:CSVエクスポート

function exportToCSV($connection, $filename) {
    $sql = "SELECT * FROM employees";
    $stmt = db2_exec($connection, $sql);

    $fp = fopen($filename, 'w');

    // ヘッダー行を書き込む
    $headers = ['社員ID', '名前', '部署', '給与'];
    fputcsv($fp, $headers);

    // データを書き込む
    while ($row = db2_fetch_array($stmt)) {
        fputcsv($fp, $row);
    }

    fclose($fp);
}

エラーハンドリング

try {
    $sql = "SELECT * FROM employees WHERE department = ?";
    $stmt = db2_prepare($connection, $sql);

    db2_bind_param($stmt, 1, $department, DB2_PARAM_IN);

    if (!db2_execute($stmt)) {
        throw new Exception("クエリ実行エラー");
    }

    $results = [];
    while ($row = db2_fetch_array($stmt)) {
        if ($row === false) {
            throw new Exception("データ取得エラー");
        }
        $results[] = $row;
    }

    return $results;

} catch (Exception $e) {
    error_log("Error: " . $e->getMessage());
    return false;
}

パフォーマンスTips 🚀

  1. 大量データの処理
// メモリ効率の良い処理
function processLargeData($connection) {
    $stmt = db2_exec($connection, "SELECT * FROM large_table");

    while ($row = db2_fetch_array($stmt)) {
        // 1行ずつ処理
        processRow($row);
        // メモリを解放
        unset($row);
    }
}
  1. 必要なカラムだけ選択
// 良い例
$sql = "SELECT id, name FROM employees";
// 悪い例
$sql = "SELECT * FROM employees";

まとめ

  • db2_fetch_arrayは結果セットから1行ずつデータを配列として取得
  • 数値インデックスと連想配列の両方の形式でアクセス可能
  • 大量データ処理時はメモリ使用に注意
  • エラーハンドリングを適切に実装することが重要

このようにdb2_fetch_arrayを使用することで、DB2データベースからのデータ取得を効率的に行うことができます。

Happy Coding! 😊

タイトルとURLをコピーしました