こんにちは!今回は、DB2データベースのdb2_fetch_row
関数について詳しく解説します。この関数は、クエリ結果から1行ずつデータを数値インデックスの配列として取得できます。
db2_fetch_rowとは?🎯
DB2のクエリ結果から1行分のデータを数値インデックスの配列として取得する関数です。シンプルで高速なデータ取得が特徴です。
基本的な使い方
$row = db2_fetch_row($statement);
基本的な使用例
例1:シンプルなデータ取得
$sql = "SELECT emp_id, name, department FROM employees";
$stmt = db2_exec($connection, $sql);
while ($row = db2_fetch_row($stmt)) {
echo "社員ID: " . $row[0] . "\n";
echo "名前: " . $row[1] . "\n";
echo "部署: " . $row[2] . "\n";
echo "---------------\n";
}
例2:テーブル表示
function displayEmployeeTable($connection) {
$sql = "SELECT * FROM employees";
$stmt = db2_exec($connection, $sql);
echo "<table border='1'>";
while ($row = db2_fetch_row($stmt)) {
echo "<tr>";
foreach ($row as $value) {
echo "<td>" . htmlspecialchars($value) . "</td>";
}
echo "</tr>";
}
echo "</table>";
}
実践的な使用例
例1:CSVエクスポート機能
function exportToCSV($connection, $filename) {
$sql = "SELECT * FROM employees ORDER BY emp_id";
$stmt = db2_exec($connection, $sql);
$fp = fopen($filename, 'w');
while ($row = db2_fetch_row($stmt)) {
fputcsv($fp, $row);
}
fclose($fp);
}
例2:データ集計処理
function calculateDepartmentStats($connection) {
$sql = "SELECT department, salary FROM employees";
$stmt = db2_exec($connection, $sql);
$stats = [];
while ($row = db2_fetch_row($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:バッチ処理
function processBatchData($connection, $batchSize = 1000) {
$sql = "SELECT * FROM large_table";
$stmt = db2_exec($connection, $sql);
$batch = [];
$count = 0;
while ($row = db2_fetch_row($stmt)) {
$batch[] = $row;
$count++;
if ($count >= $batchSize) {
processBatch($batch);
$batch = [];
$count = 0;
}
}
// 残りのデータを処理
if (!empty($batch)) {
processBatch($batch);
}
}
エラーハンドリング
function safeDataFetch($connection, $sql) {
try {
$stmt = db2_exec($connection, $sql);
if (!$stmt) {
throw new Exception("クエリ実行エラー");
}
$results = [];
while ($row = db2_fetch_row($stmt)) {
if ($row === false) {
throw new Exception("データ取得エラー");
}
$results[] = $row;
}
return $results;
} catch (Exception $e) {
error_log("Error: " . $e->getMessage());
return false;
}
}
パフォーマンス最適化 🚀
1. メモリ効率の良い処理
function processLargeDataset($connection) {
$stmt = db2_exec($connection, "SELECT * FROM large_table");
while ($row = db2_fetch_row($stmt)) {
processRow($row);
unset($row); // メモリ解放
}
}
2. 必要なカラムのみ選択
// 良い例
$sql = "SELECT id, name FROM employees";
// 悪い例
$sql = "SELECT * FROM employees";
3. インデックスの活用
function getEmployeesByDepartment($connection, $department) {
$sql = "SELECT * FROM employees WHERE department = ? ";
$stmt = db2_prepare($connection, $sql);
db2_bind_param($stmt, 1, $department, DB2_PARAM_IN);
db2_execute($stmt);
$employees = [];
while ($row = db2_fetch_row($stmt)) {
$employees[] = $row;
}
return $employees;
}
実装のTips 💡
1. カラム位置の定数定義
class EmployeeColumns {
const ID = 0;
const NAME = 1;
const DEPARTMENT = 2;
const SALARY = 3;
}
while ($row = db2_fetch_row($stmt)) {
echo $row[EmployeeColumns::NAME];
}
2. データ検証
function validateRow($row) {
return (
isset($row[0]) &&
is_numeric($row[0]) &&
!empty($row[1]) &&
is_numeric($row[3])
);
}
3. データ変換
function transformRow($row) {
return [
'id' => (int)$row[0],
'name' => trim($row[1]),
'department' => $row[2],
'salary' => number_format($row[3])
];
}
まとめ
db2_fetch_row
は数値インデックスでデータにアクセス- シンプルで高速なデータ取得が可能
- 大規模データ処理時はメモリ管理に注意
- カラム位置の管理が重要
これでdb2_fetch_row
の使い方をマスターできましたね!
効率的なデータ処理を実現していきましょう。
Happy Coding! 😊