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