234 lines
5.8 KiB
PHP
234 lines
5.8 KiB
PHP
<?php
|
|
// kngil/bbs/qa_detail.php
|
|
|
|
ini_set('display_errors', 1);
|
|
error_reporting(E_ALL);
|
|
|
|
/* ===============================
|
|
1. 세션 & 로그인 체크
|
|
=============================== */
|
|
if (session_status() === PHP_SESSION_NONE) {
|
|
session_start();
|
|
}
|
|
|
|
if (empty($_SESSION['login'])) {
|
|
echo "<script>
|
|
alert('로그인 후 이용 가능합니다.');
|
|
location.href = '/qa_list';
|
|
</script>";
|
|
exit;
|
|
}
|
|
|
|
$login = $_SESSION['login'];
|
|
$me = $login['user_id'] ?? '';
|
|
$auth = $login['auth_bc'] ?? '';
|
|
|
|
$isAdmin = in_array($auth, ['BS100100', 'BS100200']); // 개발자/관리자
|
|
|
|
/* ===============================
|
|
2. DB 연결 (PostgreSQL)
|
|
=============================== */
|
|
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
|
|
|
/* ===============================
|
|
4. 삭제 처리
|
|
=============================== */
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'delete') {
|
|
|
|
$postId = (int)($_POST['post_id'] ?? 0);
|
|
if ($postId < 1) {
|
|
die('잘못된 요청입니다.');
|
|
}
|
|
|
|
// 글 조회
|
|
$stmt = $pdo->prepare("
|
|
SELECT post_id, user_id, stat_bc
|
|
FROM kngil.qa_posts
|
|
WHERE post_id = :pid
|
|
");
|
|
$stmt->execute([':pid' => $postId]);
|
|
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$post) {
|
|
die('존재하지 않는 글입니다.');
|
|
}
|
|
|
|
// 상태 제한 (검토중 / 완료면 삭제 불가)
|
|
if (in_array($post['stat_bc'], ['REVIEW', 'DONE']) && !$isAdmin) {
|
|
die('검토중이거나 답변 완료된 글은 삭제할 수 없습니다.');
|
|
}
|
|
|
|
// 권한 체크 (본인 or 관리자)
|
|
if (!$isAdmin && $post['user_id'] !== $loginUser['user_id']) {
|
|
die('삭제 권한이 없습니다.');
|
|
}
|
|
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
// 1️⃣ 첨부파일 삭제
|
|
$fs = $pdo->prepare("
|
|
SELECT save_path
|
|
FROM kngil.qa_attachments
|
|
WHERE post_id = :pid
|
|
");
|
|
$fs->execute([':pid' => $postId]);
|
|
|
|
foreach ($fs->fetchAll() as $f) {
|
|
$file = $_SERVER['DOCUMENT_ROOT'] . $f['save_path'];
|
|
if (is_file($file)) unlink($file);
|
|
}
|
|
|
|
$pdo->prepare("DELETE FROM kngil.qa_attachments WHERE post_id = ?")
|
|
->execute([$postId]);
|
|
|
|
// 2️⃣ 댓글 삭제
|
|
$pdo->prepare("DELETE FROM kngil.qa_comments WHERE post_id = ?")
|
|
->execute([$postId]);
|
|
|
|
// 3️⃣ 본문 삭제
|
|
$pdo->prepare("DELETE FROM kngil.qa_posts WHERE post_id = ?")
|
|
->execute([$postId]);
|
|
|
|
$pdo->commit();
|
|
|
|
header("Location: /qa_list");
|
|
exit;
|
|
|
|
} catch (Exception $e) {
|
|
$pdo->rollBack();
|
|
die('삭제 중 오류 발생: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/* ===============================
|
|
3. post_id 검증
|
|
=============================== */
|
|
$postId = (int)($_GET['id'] ?? 0);
|
|
if ($postId < 1) {
|
|
exit('잘못된 접근입니다.');
|
|
}
|
|
|
|
|
|
/* ===============================
|
|
5. 글 조회
|
|
=============================== */
|
|
$stmt = $pdo->prepare("
|
|
SELECT
|
|
p.post_id,
|
|
p.user_id,
|
|
p.user_nm,
|
|
p.tel_no,
|
|
p.category,
|
|
p.co_nm,
|
|
p.dept_nm,
|
|
p.title,
|
|
p.content,
|
|
p.attachment,
|
|
p.stat_bc,
|
|
p.is_secret,
|
|
p.complete_form,
|
|
p.cdt_dt,
|
|
p.mid_dt,
|
|
p.is_read_admin,
|
|
|
|
u.email
|
|
|
|
FROM kngil.qa_posts p
|
|
LEFT JOIN kngil.users u
|
|
ON p.user_id = u.user_id
|
|
WHERE p.post_id = :pid
|
|
");
|
|
$stmt->execute([':pid' => $postId]);
|
|
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$post) {
|
|
exit('존재하지 않는 글입니다.');
|
|
}
|
|
|
|
/* ===============================
|
|
6. 비밀글 접근 제어
|
|
=============================== */
|
|
if ($post['is_secret'] === 'Y' && $post['user_id'] !== $me && !$isAdmin) {
|
|
exit('⚠️ 비밀글은 작성자 또는 관리자만 확인할 수 있습니다.');
|
|
}
|
|
|
|
/* ===============================
|
|
7. 관리자 열람 처리
|
|
=============================== */
|
|
if ($isAdmin && $post['is_read_admin'] === 'N') {
|
|
$pdo->prepare("
|
|
UPDATE kngil.qa_posts
|
|
SET is_read_admin = 'Y'
|
|
WHERE post_id = :pid
|
|
")->execute([':pid' => $postId]);
|
|
}
|
|
|
|
/* ===============================
|
|
8. 라벨 매핑
|
|
=============================== */
|
|
$STATUS_LABELS = [
|
|
'WAIT' => '문의접수',
|
|
'REVIEW'=> '검토중',
|
|
'DONE' => '답변완료'
|
|
];
|
|
|
|
$CATEGORY_LABELS = [
|
|
'general' => '일반문의',
|
|
'improvement' => '개선문의',
|
|
'error' => '오류문의',
|
|
'notice' => '공지사항'
|
|
];
|
|
|
|
$post['status_label'] = $STATUS_LABELS[$post['stat_bc']] ?? $post['stat_bc'];
|
|
$post['category_label'] = $CATEGORY_LABELS[$post['category']] ?? $post['category'];
|
|
$post['display_name'] = $post['user_nm'];
|
|
|
|
/* ===============================
|
|
9. 첨부파일 조회
|
|
=============================== */
|
|
$af = $pdo->prepare("
|
|
SELECT
|
|
id,
|
|
ori_name,
|
|
save_path,
|
|
file_size,
|
|
uploaded_at
|
|
FROM kngil.qa_attachments
|
|
WHERE post_id = :pid
|
|
ORDER BY id ASC
|
|
");
|
|
$af->execute([':pid' => $postId]);
|
|
$attachments = $af->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
/* ===============================
|
|
10. 댓글 조회 (일단 구조만)
|
|
=============================== */
|
|
$stmt = $pdo->prepare("
|
|
SELECT
|
|
comment_id,
|
|
post_id,
|
|
commenter,
|
|
content,
|
|
user_nm,
|
|
cdt_dt
|
|
FROM kngil.qa_comments
|
|
WHERE post_id = :post_id
|
|
ORDER BY cdt_dt ASC
|
|
");
|
|
$stmt->execute([
|
|
':post_id' => $postId
|
|
]);
|
|
|
|
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
/* ===============================
|
|
11. 소유자 여부 (수정 버튼용)
|
|
=============================== */
|
|
$isOwner = ($post['user_id'] === $me);
|
|
|
|
/* ===============================
|
|
12. 스킨 렌더링
|
|
=============================== */
|
|
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_detail.php';
|