'myclass', 'CA10002' => 'onboarding', 'CA10003' => 'legal', 'CA10004' => 'leader', 'CA10005' => 'insight', 'CA10006' => 'biz', ]; return $map[$categoryCode] ?? 'etc'; } try { $pdo = db_conn(); $pdo->exec("SET NAMES 'utf8mb4'"); // ★ 선택년도 파라미터 수집 $selectedYear = trim((string)($_GET['selected_year'] ?? date('Y'))); if ($selectedYear === '' || !preg_match('/^\d{4}$/', $selectedYear)) { $selectedYear = date('Y'); } // ★ 한줄소감 조회 // - 선택년도 기준 // - comment 값이 있는 이력만 // - 마이클래스(CA10001)만 // - 같은 content_id는 최신 시청이력 1건만 $sql = " SELECT lh.content_id, lh.member_id, lh.sys_comp_code, lh.watch_tm, lh.content_tm, lh.last_viewed_at, lh.completed_at, lh.comment, c.category_code, c.title, c.content_url, c.thumbnail_url FROM edu_learning_histories lh INNER JOIN ( SELECT content_id, MAX(last_viewed_at) AS max_last_viewed_at FROM edu_learning_histories WHERE member_id = :sub_member_id AND sys_comp_code = :sub_sys_comp_code AND YEAR(last_viewed_at) = :sub_selected_year AND comment IS NOT NULL AND TRIM(comment) <> '' GROUP BY content_id ) latest ON latest.content_id = lh.content_id AND latest.max_last_viewed_at = lh.last_viewed_at INNER JOIN edu_contents c ON c.content_id = lh.content_id WHERE lh.member_id = :main_member_id AND lh.sys_comp_code = :main_sys_comp_code AND c.category_code = 'CA10001' AND lh.comment IS NOT NULL AND TRIM(lh.comment) <> '' ORDER BY lh.last_viewed_at DESC "; $stmt = $pdo->prepare($sql); $stmt->execute([ ':sub_member_id' => $memberId, ':sub_sys_comp_code' => $sysCompCode, ':sub_selected_year' => (int)$selectedYear, ':main_member_id' => $memberId, ':main_sys_comp_code' => $sysCompCode, ]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $totalCount = count($rows); ob_start(); if (!empty($rows)) { foreach ($rows as $row) { $categoryCode = (string)($row['category_code'] ?? ''); $tagClass = review_category_tag_class($categoryCode); // ★ 실제 한줄소감은 edu_learning_histories.comment 사용 $reviewText = trim((string)($row['comment'] ?? '')); ?>
= h($row['title'] ?? '') ?>