こんにちは!今回は、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! 😊
 
  
  
  
  