[PHP]DB2のdb2_fetch_both関数でデータを柔軟に取得しよう!

PHP

こんにちは!今回は、DB2データベースのdb2_fetch_both関数について詳しく解説します。この関数は、数値インデックスと連想配列の両方の形式でデータを取得できる便利な関数です。

db2_fetch_bothとは?🤔

数値インデックスと連想配列の両方の形式でデータにアクセスできる関数です。1行のデータに対して、複数の方法でアクセスが可能になります。

基本的な使い方

$row = db2_fetch_both($statement);

基本的な使用例

例1:両方のアクセス方法を使用

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

while ($row = db2_fetch_both($stmt)) {
    // 数値インデックスでアクセス
    echo "社員ID: " . $row[0] . "\n";

    // 連想配列でアクセス
    echo "名前: " . $row['NAME'] . "\n";

    echo "---------------\n";
}

例2:データの表示方法の比較

function displayEmployee($row) {
    // 数値インデックス方式
    echo "方法1: " . $row[0] . ", " . $row[1] . ", " . $row[2] . "\n";

    // 連想配列方式
    echo "方法2: " . $row['EMP_ID'] . ", " . $row['NAME'] . ", " . 
         $row['DEPARTMENT'] . "\n";
}

実践的な使用例

例1:従業員データの詳細表示

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

    echo "<table border='1'>";
    $firstRow = true;

    while ($row = db2_fetch_both($stmt)) {
        // ヘッダーの出力(最初の行のみ)
        if ($firstRow) {
            echo "<tr>";
            foreach ($row as $key => $value) {
                if (!is_numeric($key)) {  // 連想配列キーのみ使用
                    echo "<th>" . htmlspecialchars($key) . "</th>";
                }
            }
            echo "</tr>";
            $firstRow = false;
        }

        // データ行の出力
        echo "<tr>";
        for ($i = 0; $i < count($row)/2; $i++) {  // 数値インデックスを使用
            echo "<td>" . htmlspecialchars($row[$i]) . "</td>";
        }
        echo "</tr>";
    }

    echo "</table>";
}

例2:データのエクスポート機能

function exportEmployeeData($connection, $format = 'csv') {
    $sql = "SELECT * FROM employees";
    $stmt = db2_exec($connection, $sql);
    $data = [];

    while ($row = db2_fetch_both($stmt)) {
        // 連想配列形式でデータを保存
        $employeeData = [
            'id' => $row['EMP_ID'],
            'name' => $row['NAME'],
            'department' => $row['DEPARTMENT'],
            'salary' => $row['SALARY']
        ];

        switch($format) {
            case 'csv':
                // 数値インデックスを使用してCSV形式で出力
                echo implode(',', array_values($row)) . "\n";
                break;

            case 'json':
                // 連想配列形式でJSONデータを作成
                $data[] = $employeeData;
                break;
        }
    }

    if ($format === 'json') {
        return json_encode($data);
    }
}

例3:データの検証と変換

function validateAndTransformData($connection) {
    $sql = "SELECT * FROM employees";
    $stmt = db2_exec($connection, $sql);
    $validData = [];

    while ($row = db2_fetch_both($stmt)) {
        // 両方のアクセス方法を使用した検証
        if (
            is_numeric($row[0]) &&                    // ID検証
            !empty($row['NAME']) &&                   // 名前検証
            in_array($row['DEPARTMENT'], ['営業', '技術', '管理'])  // 部署検証
        ) {
            $validData[] = [
                'id' => (int)$row[0],
                'name' => trim($row['NAME']),
                'department' => $row['DEPARTMENT']
            ];
        }
    }

    return $validData;
}

エラーハンドリング

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

        $results = [];
        while ($row = db2_fetch_both($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_both($stmt)) {
        processRow($row);
        unset($row);  // メモリ解放
    }
}

2. データアクセスの使い分け

function accessData($row) {
    // 数値の場合は数値インデックス
    $id = $row[0];  // より高速

    // 文字列の場合は連想配列
    $name = $row['NAME'];  // より可読性が高い
}

まとめ

  • db2_fetch_bothは柔軟なデータアクセスが可能
  • 数値インデックスと連想配列の両方が使える
  • 使用目的に応じて適切なアクセス方法を選択
  • 大規模データの処理時はメモリ管理に注意

これでdb2_fetch_bothの使い方をマスターできましたね!
状況に応じて最適なデータアクセス方法を選択していきましょう。

Happy Coding! 😊

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