PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC] ); // $postId = (int)($_GET['id']??0); // 글·댓글 조회… // (4) postId 검증 $postId = isset($_GET['id']) ? (int)$_GET['id'] : 0; if ($postId < 1) { exit('잘못된 접근입니다.'); } // 2) 글 조회 $stmt = $pdo->prepare(" SELECT post_id, login_id, user_id, category, title, content, is_secret, status, created_at, is_internal, company, family_company, department, user_name, phone FROM qa_posts WHERE post_id = :pid "); $stmt->execute([':pid'=>$postId]); $post = $stmt->fetch(); if (!$post) exit('존재하지 않는 글입니다.'); // 관리자/일반 사용자 표시 이름 가공 $post['display_name'] = get_admin_display_name( $post['login_id'], $post['user_name'] ?: $post['login_id'] ); //관리자 글 조회시 new 미표시 if ($admin && $post['category'] !== 'notice') { $pdo->prepare("UPDATE qa_posts SET is_read_admin = 1 WHERE post_id = ?") ->execute([$postId]); } // ▼ 비밀글 접근 체크 ▼ if ($post['is_secret'] && $post['login_id'] !== $me && !$admin) { exit('⚠️ 비밀글은 작성자만 또는 관리자만 확인할 수 있습니다.'); } // 회사/부서 표시 로직 if ((int)$post['is_internal'] === 1) { // 내부 사용자 → family_company + department $post['org_display'] = trim($post['family_company'] . ' ' . $post['department']); } else { // 외부 사용자 → company + department $post['org_display'] = trim($post['company'] . ' ' . $post['department']); } // 3) 댓글 조회 $cm = $pdo->prepare(" SELECT comment_id, commenter AS login_id, user_name, content AS comment_text, created_at FROM qa_comments WHERE post_id = :pid ORDER BY created_at "); $cm->execute([':pid'=>$postId]); $comments = $cm->fetchAll(); /* 관리자 이름 고정 처리 */ foreach ($comments as &$c) { $c['user_name'] = get_admin_display_name($c['login_id'], $c['user_name']); } unset($c); // 참조 해제 // 첨부파일 조회 $attachments = []; $af = $pdo->prepare(" SELECT id, ori_name, save_path, file_size, uploaded_at FROM qa_attachments WHERE post_id = :pid ORDER BY id ASC "); $af->execute([':pid'=>$postId]); $attachments = $af->fetchAll(); // 상태/구분 라벨 매핑 $STATUS_LABELS = [ 'new' => 'New', 'review' => 'Review', 'deep' => 'Checking', 'patch' => 'Patch', 'done' => 'Done' ]; $CATEGORY_LABELS = [ 'general' => 'Other', 'improvement' => 'Impr.', 'error' => 'Error', 'notice' => '공지사항', 'admin' => '관리글', ]; // detail 뷰용 라벨 추가 $post['status_label'] = ($post['category'] === 'notice') ? '' : ($STATUS_LABELS[$post['status']] ?? $post['status']); $post['category_label'] = $CATEGORY_LABELS[$post['category']] ?? $post['category']; //Q&A user login_version $isAdmin = $admin; $loginVersion = null; if ($isAdmin) { $st = $pdo->prepare("SELECT login_version FROM user_program_info WHERE login_id = ? ORDER BY id DESC LIMIT 1"); $st->execute([$post['login_id']]); // 글쓴이 로그인 ID 기준 $loginVersion = $st->fetchColumn(); } // 4) 뷰 렌더링 (데이터 준비가 완료된 뒤에) include __DIR__ . '/../skin/qa/basic/descope_qa_detail.skin.php'; ?>