prepare("SELECT MAX(goal_code) AS max_code FROM edu_learning_goals WHERE goal_code LIKE :pfx"); $stmt->execute([':pfx' => $prefix . '%']); $max = $stmt->fetchColumn(); $next = 1; // 기본 순번은 1로 설정합니다. // 이전에 등록된 코드가 있다면, 마지막 세 자리 숫자를 추출하여 1을 더해줍니다. if ($max) { $seq = (int) substr($max, -3); $next = $seq + 1; } // 생성된 번호를 3자리 형식(001, 002 등)으로 포맷팅한 후 반환합니다. return $prefix . str_pad((string) $next, 3, '0', STR_PAD_LEFT); } // POST로 전달된 값들을 변수에 대입합니다. 빈 값 처리와 trim을 수행합니다. $goal_code = isset($_POST['goal_code']) ? trim($_POST['goal_code']) : ''; $title = isset($_POST['title']) ? trim($_POST['title']) : ''; $base_year = isset($_POST['base_year']) ? trim($_POST['base_year']) : date('Y'); $quarter = isset($_POST['quarter']) ? trim($_POST['quarter']) : null; $is_active = isset($_POST['is_active']) ? '1' : '0'; $sort_order = isset($_POST['sort_order']) && $_POST['sort_order'] !== '' ? (int) $_POST['sort_order'] : null; $remarks = isset($_POST['remarks']) ? trim($_POST['remarks']) : null; // 필수 입력 항목인 제목과 기준년도가 누락되었다면 에러 파라미터와 함께 되돌아갑니다. if ($title === '' || $base_year === '') { header('Location: ../skin/content_upload.php?goal_error=required'); exit; } $goal_no = isset($_POST['goal_no']) ? trim($_POST['goal_no']) : null; $qParam = $quarter !== '' ? $quarter : null; $gnParam = $goal_no !== '' ? $goal_no : null; // Validate uniqueness of year, quarter and goal_no if ($gnParam !== null && $qParam !== null) { $dupSql = "SELECT COUNT(*) FROM edu_learning_goals WHERE base_year = :by AND quarter = :q AND goal_no = :gn"; $dupParams = [':by' => $base_year, ':q' => $qParam, ':gn' => $gnParam]; if ($goal_code !== '') { $dupSql .= " AND goal_code != :gc"; $dupParams[':gc'] = $goal_code; } $chk = $pdo->prepare($dupSql); $chk->execute($dupParams); if ($chk->fetchColumn() > 0) { echo json_encode(['success' => false, 'message' => '해당 년도/분기에 이미 같은 책장번호가 사용되었습니다.']); exit; } } // 기존에 존재하는 학습목표 코드(goal_code)가 넘겨져왔다면, 수정(UPDATE) 동작을 수행합니다. if ($goal_code !== '') { // 업데이트할 필드들을 지정하는 쿼리입니다. $sql = "UPDATE edu_learning_goals SET title=:title, quarter=:quarter, base_year=:base_year, is_active=:is_active, sort_order=:sort_order, remarks=:remarks, goal_no=:goal_no WHERE goal_code=:goal_code"; $stmt = $pdo->prepare($sql); // 파라미터를 바인딩합니다. $stmt->bindValue(':title', $title); $stmt->bindValue(':quarter', $quarter !== '' ? $quarter : null, $quarter !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); $stmt->bindValue(':base_year', $base_year); $stmt->bindValue(':is_active', $is_active); // 정렬 순서 파라미터는 null 허용이므로 분기 처리하여 바인딩합니다. if ($sort_order === null) { $stmt->bindValue(':sort_order', null, PDO::PARAM_NULL); } else { $stmt->bindValue(':sort_order', $sort_order, PDO::PARAM_INT); } $stmt->bindValue(':remarks', $remarks !== '' ? $remarks : null, $remarks !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); $stmt->bindValue(':goal_no', $goal_no !== '' ? $goal_no : null, $goal_no !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); $stmt->bindValue(':goal_code', $goal_code); // 수정 쿼리를 실행합니다. $stmt->execute(); } // 전송된 코드가 없다면, 신규 등록(INSERT) 동작을 수행합니다. else { // 위의 생성 함수를 통해 새로운 코드를 채번합니다. $goal_code = generate_goal_code($pdo, $base_year); $sql = "INSERT INTO edu_learning_goals (goal_code, title, quarter, base_year, is_active, sort_order, remarks, goal_no, created_at) VALUES (:goal_code, :title, :quarter, :base_year, :is_active, :sort_order, :remarks, :goal_no, NOW())"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':goal_code', $goal_code); $stmt->bindValue(':title', $title); $stmt->bindValue(':quarter', $quarter !== '' ? $quarter : null, $quarter !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); $stmt->bindValue(':base_year', $base_year); $stmt->bindValue(':is_active', $is_active); if ($sort_order === null) { $stmt->bindValue(':sort_order', null, PDO::PARAM_NULL); } else { $stmt->bindValue(':sort_order', $sort_order, PDO::PARAM_INT); } $stmt->bindValue(':remarks', $remarks !== '' ? $remarks : null, $remarks !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); $stmt->bindValue(':goal_no', $goal_no !== '' ? $goal_no : null, $goal_no !== '' ? PDO::PARAM_STR : PDO::PARAM_NULL); // 등록 쿼리를 실행합니다. $stmt->execute(); } // AJAX JSON response echo json_encode(['success' => true]); exit;