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