232 lines
6.8 KiB
PHP
232 lines
6.8 KiB
PHP
<?php
|
||
ini_set('display_errors', 1);
|
||
error_reporting(E_ALL);
|
||
|
||
|
||
/* ===============================
|
||
1. 세션 & 로그인 체크
|
||
=============================== */
|
||
if (session_status() === PHP_SESSION_NONE) {
|
||
session_start();
|
||
}
|
||
|
||
// echo '<pre>';
|
||
// var_dump($_SESSION['login']);
|
||
// exit;
|
||
|
||
if (empty($_SESSION['login'])) {
|
||
echo "<script>
|
||
alert('로그인이 필요합니다.');
|
||
location.href = '/kngil/skin/qa_list.skin.php';
|
||
</script>";
|
||
exit;
|
||
}
|
||
|
||
$loginUser = $_SESSION['login'];
|
||
|
||
/* ===============================
|
||
2. DB 연결
|
||
=============================== */
|
||
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
|
||
|
||
/* ===============================
|
||
3. 수정 여부 판단
|
||
=============================== */
|
||
$postId = isset($_GET['id']) ? (int)$_GET['id'] : 0;
|
||
$isEdit = $postId > 0;
|
||
|
||
/* ===============================
|
||
4. 수정 모드 – 기존 글 로드
|
||
=============================== */
|
||
$post = [
|
||
'category' => '',
|
||
'title' => '',
|
||
'content' => '',
|
||
'is_secret' => 'N',
|
||
];
|
||
|
||
if ($isEdit) {
|
||
$stmt = $pdo->prepare("SELECT * FROM kngil.qa_posts WHERE post_id = :pid");
|
||
$stmt->execute([':pid' => $postId]);
|
||
$post = $stmt->fetch(PDO::FETCH_ASSOC);
|
||
|
||
if (!$post) {
|
||
die('존재하지 않는 글입니다.');
|
||
}
|
||
|
||
// 작성자 본인만 수정 가능
|
||
if ($post['user_id'] !== ($loginUser['user_id'] ?? '')) {
|
||
die('수정 권한이 없습니다.');
|
||
}
|
||
}
|
||
|
||
/* ===============================
|
||
5. 첨부파일 업로드
|
||
=============================== */
|
||
function handle_file_uploads(PDO $pdo, int $postId)
|
||
{
|
||
if (empty($_FILES['attach']['name'][0])) return;
|
||
|
||
$uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/kngil/uploads/qa/';
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0777, true);
|
||
}
|
||
|
||
$allowExt = ['jpg','jpeg','png','gif','pdf','hwp','doc','docx','xls','xlsx','zip'];
|
||
|
||
foreach ($_FILES['attach']['name'] as $i => $oriName) {
|
||
|
||
if ($_FILES['attach']['error'][$i] !== UPLOAD_ERR_OK) continue;
|
||
|
||
$tmp = $_FILES['attach']['tmp_name'][$i];
|
||
$size = $_FILES['attach']['size'][$i];
|
||
$ext = strtolower(pathinfo($oriName, PATHINFO_EXTENSION));
|
||
|
||
if (!in_array($ext, $allowExt)) continue;
|
||
if ($size > 30 * 1024 * 1024) continue;
|
||
|
||
$saveName = time() . '_' . bin2hex(random_bytes(6)) . '.' . $ext;
|
||
$savePath = $uploadDir . $saveName;
|
||
|
||
if (!move_uploaded_file($tmp, $savePath)) continue;
|
||
|
||
$stmt = $pdo->prepare("
|
||
INSERT INTO kngil.qa_attachments (
|
||
post_id,
|
||
ori_name,
|
||
save_path,
|
||
file_size,
|
||
uploaded_at
|
||
) VALUES (
|
||
:post_id,
|
||
:ori_name,
|
||
:save_path,
|
||
:file_size,
|
||
NOW()
|
||
)
|
||
");
|
||
|
||
$stmt->execute([
|
||
':post_id' => $postId,
|
||
':ori_name' => $oriName,
|
||
':save_path' => '/kngil/uploads/qa/' . $saveName,
|
||
':file_size' => $size
|
||
]);
|
||
}
|
||
}
|
||
|
||
|
||
/* ===============================
|
||
6. POST 처리 (등록 / 수정)
|
||
=============================== */
|
||
$errors = [];
|
||
|
||
$secret = 'N';
|
||
$category = '';
|
||
$title = '';
|
||
$content = '';
|
||
|
||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
|
||
$category = trim($_POST['category'] ?? '');
|
||
$title = trim($_POST['title'] ?? '');
|
||
$content = trim($_POST['content'] ?? '');
|
||
$secret = isset($_POST['secret']) ? 'Y' : 'N';
|
||
|
||
if ($category === '') $errors[] = '구분을 선택하세요.';
|
||
if ($title === '') $errors[] = '제목을 입력하세요.';
|
||
if ($content === '') $errors[] = '내용을 입력하세요.';
|
||
|
||
// 첨부파일명만 저장 (실파일 저장은 추후 분리 가능)
|
||
$attachment = null;
|
||
if (!empty($_FILES['attach']['name'][0])) {
|
||
$attachment = implode(',', $_FILES['attach']['name']);
|
||
}
|
||
|
||
if (empty($errors)) {
|
||
try {
|
||
|
||
if ($isEdit) {
|
||
/* ---------- UPDATE ---------- */
|
||
$stmt = $pdo->prepare("
|
||
UPDATE kngil.qa_posts
|
||
SET category = :category,
|
||
title = :title,
|
||
content = :content,
|
||
is_secret = :is_secret,
|
||
mid_dt = NOW()
|
||
WHERE post_id = :pid
|
||
");
|
||
$stmt->execute([
|
||
':category' => $category,
|
||
':title' => $title,
|
||
':content' => $content,
|
||
':is_secret' => $secret, // 'Y' or 'N'
|
||
':pid' => $postId
|
||
]);
|
||
handle_file_uploads($pdo, $postId);
|
||
|
||
} else {
|
||
/* ---------- INSERT ---------- */
|
||
$stmt = $pdo->prepare("
|
||
INSERT INTO kngil.qa_posts (
|
||
user_id,
|
||
user_nm,
|
||
tel_no,
|
||
co_nm,
|
||
dept_nm,
|
||
category,
|
||
title,
|
||
content,
|
||
is_secret,
|
||
stat_bc,
|
||
is_read_admin,
|
||
cdt_dt
|
||
) VALUES (
|
||
:user_id,
|
||
:user_nm,
|
||
:tel_no,
|
||
:co_nm,
|
||
:dept_nm,
|
||
:category,
|
||
:title,
|
||
:content,
|
||
:is_secret,
|
||
'wait',
|
||
'N',
|
||
NOW()
|
||
)
|
||
RETURNING post_id
|
||
");
|
||
// var_dump($loginUser);
|
||
// exit;
|
||
$stmt->execute([
|
||
':user_id' => $loginUser['user_id'],
|
||
':user_nm' => $loginUser['user_nm'],
|
||
':tel_no' => $loginUser['tel_no'] ?? null,
|
||
':co_nm' => $loginUser['co_nm'] ?? null,
|
||
':dept_nm' => $loginUser['dept_nm'] ?? null,
|
||
':category' => $category,
|
||
':title' => $title,
|
||
':content' => $content,
|
||
':is_secret' => $secret
|
||
]);
|
||
|
||
$postId = $stmt->fetchColumn();
|
||
handle_file_uploads($pdo, $postId);
|
||
}
|
||
|
||
header("Location: /kngil/bbs/qa_detail.php?id={$postId}");
|
||
exit;
|
||
|
||
} catch (Exception $e) {
|
||
$errors[] = 'DB 오류: ' . $e->getMessage();
|
||
}
|
||
}
|
||
}
|
||
|
||
/* ===============================
|
||
7. 화면 출력
|
||
=============================== */
|
||
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_write.skin.php';
|