[PHP]DB2で連想配列を取得!db2_fetch_assocの分かりやすい解説

PHP

こんにちは!今回は、DB2データベースから結果を連想配列として取得するdb2_fetch_assoc関数について、実践的に解説していきます!

db2_fetch_assocとは?🤔

この関数は、DB2のクエリ結果から1行ずつデータを連想配列として取得します。カラム名をキーとして使用できるため、より直感的にデータにアクセスできます。

基本的な使い方

$row = db2_fetch_assoc($statement);

基本的な使用例

例1:シンプルなデータ取得

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

while ($row = db2_fetch_assoc($stmt)) {
    echo "社員ID: " . $row['EMP_ID'] . "\n";
    echo "名前: " . $row['NAME'] . "\n";
    echo "部署: " . $row['DEPARTMENT'] . "\n";
    echo "---------------\n";
}

例2:テーブル形式での表示

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

    echo "<table border='1'>";
    // ヘッダー行
    $first = true;
    while ($row = db2_fetch_assoc($stmt)) {
        if ($first) {
            echo "<tr>";
            foreach (array_keys($row) as $header) {
                echo "<th>" . htmlspecialchars($header) . "</th>";
            }
            echo "</tr>";
            $first = false;
        }
        // データ行
        echo "<tr>";
        foreach ($row as $value) {
            echo "<td>" . htmlspecialchars($value) . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}

実践的な使用例

例1:社員情報の検索システム

function searchEmployees($connection, $searchTerm) {
    $sql = "SELECT * FROM employees 
            WHERE UPPER(name) LIKE UPPER(?) 
            OR UPPER(department) LIKE UPPER(?)";

    $stmt = db2_prepare($connection, $sql);
    $searchPattern = "%" . $searchTerm . "%";

    db2_bind_param($stmt, 1, $searchPattern, DB2_PARAM_IN);
    db2_bind_param($stmt, 2, $searchPattern, DB2_PARAM_IN);

    db2_execute($stmt);

    $results = [];
    while ($row = db2_fetch_assoc($stmt)) {
        $results[] = $row;
    }

    return $results;
}

例2:部署別の統計情報

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

    $stats = [];
    while ($row = db2_fetch_assoc($stmt)) {
        $dept = $row['DEPARTMENT'];
        $salary = $row['SALARY'];

        if (!isset($stats[$dept])) {
            $stats[$dept] = [
                'count' => 0,
                'total_salary' => 0,
                'avg_salary' => 0
            ];
        }

        $stats[$dept]['count']++;
        $stats[$dept]['total_salary'] += $salary;
        $stats[$dept]['avg_salary'] = 
            $stats[$dept]['total_salary'] / $stats[$dept]['count'];
    }

    return $stats;
}

例3:JSONレスポンス用データ作成

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

    $employees = [];
    while ($row = db2_fetch_assoc($stmt)) {
        $employees[] = [
            'id' => $row['EMP_ID'],
            'name' => $row['NAME'],
            'department' => $row['DEPARTMENT'],
            'salary' => (float)$row['SALARY']
        ];
    }

    return json_encode($employees);
}

エラーハンドリング

function fetchEmployeeData($connection, $empId) {
    try {
        $sql = "SELECT * FROM employees WHERE emp_id = ?";
        $stmt = db2_prepare($connection, $sql);

        if (!$stmt) {
            throw new Exception("準備されたステートメントの作成に失敗");
        }

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

        if (!db2_execute($stmt)) {
            throw new Exception("クエリの実行に失敗");
        }

        $result = db2_fetch_assoc($stmt);

        if ($result === false) {
            throw new Exception("データの取得に失敗");
        }

        return $result;

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

Tips & Tricks 💡

1. カラム名の大文字小文字

// DB2では通常、カラム名は大文字で返される
$row['NAME']    // 正しい
$row['name']    // 動作しない可能性あり

2. メモリ効率の良い処理

function processLargeDataset($connection) {
    $stmt = db2_exec($connection, "SELECT * FROM large_table");

    while ($row = db2_fetch_assoc($stmt)) {
        processRow($row);
        unset($row); // メモリ解放
    }
}

3. データの整形

function formatEmployeeData($row) {
    return [
        'id' => (int)$row['EMP_ID'],
        'name' => trim($row['NAME']),
        'salary' => number_format($row['SALARY']),
        'hired_date' => date('Y-m-d', strtotime($row['HIRE_DATE']))
    ];
}

まとめ

  • db2_fetch_assocは連想配列でデータを取得できる
  • カラム名をキーとして使用できるため、直感的
  • 大文字小文字の違いに注意
  • エラーハンドリングを適切に実装することが重要

これでdb2_fetch_assocの使い方をマスターできましたね!
より読みやすく保守しやすいコードを書いていきましょう。

Happy Coding! 😊

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