GNU/skin/board/_NEW_BASIC/write_update.skin.php
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

## 날짜/시간
$date_custom = isset($_POST['wr_date_custom']) ? trim($_POST['wr_date_custom']) : '';
$time_custom = isset($_POST['wr_time_custom']) ? trim($_POST['wr_time_custom']) : '';

if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date_custom)) {
    $date_custom = date('Y-m-d');
}

if (!preg_match('/^\d{2}:\d{2}(:\d{2})?$/', $time_custom)) {
    $time_custom = date('H:i:s');
} else if (strlen($time_custom) === 5) {
    $time_custom .= ':00';
}

$wr_datetime = "{$date_custom} {$time_custom}";
sql_query(" update $write_table set wr_datetime = '$wr_datetime' where wr_id = '$wr_id' ");
//-----------------------------------------------
## 종료일/시
if ($x2_end) {
    $x2_datetime = "{$x2_ymd} {$x2_his}";
    sql_query(" update $write_table set x2_datetime = '$x2_datetime' where wr_id = '$wr_id' ");
} else {
    sql_query(" update $write_table set x2_datetime = '' where wr_id = '$wr_id' ");
}
//-----------------------------------------------
## 비트코인 시세 집계 날짜
if ($jy_btc) {
    $btc_datetime = "{$btc_ymd} {$btc_his}";
    sql_query(" update $write_table set btc_datetime = '$btc_datetime' where wr_id = '$wr_id' ");
} else {
    sql_query(" update $write_table set btc_datetime = '' where wr_id = '$wr_id' ");
}
//-----------------------------------------------

$x2_korean_name = isset($_POST['x2_korean_name']) ? sql_escape_string(trim($_POST['x2_korean_name'])) : '';
$x2_run = isset($_POST['x2_run']) ? '1' : '0';
$x2_ca2 = isset($_POST['x2_ca2']) ? sql_escape_string(trim($_POST['x2_ca2'])) : '';
$x2_ca3 = isset($_POST['x2_ca3']) ? sql_escape_string(trim($_POST['x2_ca3'])) : '';
$x2_ver = isset($_POST['x2_ver']) ? sql_escape_string(trim($_POST['x2_ver'])) : '';
$x2_tag = isset($_POST['x2_tag']) ? sql_escape_string(trim($_POST['x2_tag'])) : (isset($_POST['wr_1']) ? sql_escape_string(trim($_POST['wr_1'])) : '');
$x2_top = isset($_POST['x2_top']) ? '1' : '0';
$x2_label = isset($_POST['x2_label']) ? '1' : '0';
$x2_core = isset($_POST['x2_core']) ? '1' : '0';
$x2_memo_button = isset($_POST['x2_memo_button']) ? '1' : '0';
$x2_memo_clean = isset($_POST['x2_memo_clean']) ? '1' : '0';
$x2_memo = isset($_POST['x2_memo']) ? sql_escape_string(trim($_POST['x2_memo'])) : '';

sql_query(" update $write_table set x2_run = '$x2_run' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_ca2 = '$x2_ca2' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_ca3 = '$x2_ca3' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_tag = '$x2_tag' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_ver = '$x2_ver' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_korean_name = '$x2_korean_name' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_top = '$x2_top' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_label = '$x2_label' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_core = '$x2_core' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_memo_button = '$x2_memo_button' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_memo_clean = '$x2_memo_clean' where wr_id = '$wr_id' ");
sql_query(" update $write_table set x2_memo = '$x2_memo' where wr_id = '$wr_id' ");

// 1. 오빠가 입력한 코인명 (순정 이름)
$origin_coin = isset($wr_subject) ? trim($wr_subject) : '';

if ($origin_coin) {
    // 2. [목표 설정] 오빠 명령(x2_run)에 따라 최종 이름표 결정
    $is_active = (isset($_POST['x2_run']) && $_POST['x2_run'] == '1');
    $final_market = $is_active ? $origin_coin : 'OFF_' . $origin_coin;
    
    // 폼에서 넘어온 한글명 세팅 (없으면 빈 문자열)
    $k_name = isset($_POST['x2_korean_name']) ? trim($_POST['x2_korean_name']) : '';

    // 3. [구멍 탐색] 대상 테이블: daemon_bybit_Ticker
    global $db_upbit; // extend 연결 소환

    if (isset($db_upbit) && $db_upbit) {
        try {
            $check_sql = "SELECT id, symbol FROM daemon_bybit_Ticker WHERE symbol IN (:clean, :off)";
            $stmt = $db_upbit->prepare($check_sql);
            $stmt->execute([
                ':clean' => $origin_coin, 
                ':off' => 'OFF_' . $origin_coin
            ]);
            
            $row = $stmt->fetch();

            if ($row) {
                // ★ [UPDATE] 이미 있는 년이다! -> 이름표와 한글명 바꿔 달아줌 (시간은 updated_at)
                $update_sql = "UPDATE daemon_bybit_Ticker 
                               SET symbol = :new_market, 
                                   korean_name = :k_name,
                                   updated_at = NOW() 
                               WHERE id = :id";
                $stmt_up = $db_upbit->prepare($update_sql);
                $stmt_up->execute([
                    ':new_market' => $final_market,
                    ':k_name'     => $k_name,
                    ':id'         => $row['id']
                ]);
            } else {
                // ★ [INSERT] 아예 없는 년이다! -> 순차적으로 낮은 번호로 들어가게 함
                $find_id_sql = "SELECT MIN(unused.id) AS next_id
                                FROM (
                                    SELECT 1 AS id
                                    UNION ALL
                                    SELECT id + 1 FROM daemon_bybit_Ticker
                                ) AS unused
                                WHERE id NOT IN (SELECT id FROM daemon_bybit_Ticker)";
                $id_res = $db_upbit->query($find_id_sql);
                $next_id_row = $id_res->fetch();
                $next_id = $next_id_row['next_id'] ? $next_id_row['next_id'] : 1;

                // INSERT 시 korean_name과 updated_at 한 번에 처리
                $insert_sql = "INSERT INTO daemon_bybit_Ticker (id, symbol, korean_name, updated_at) 
                               VALUES (:next_id, :new_market, :k_name, NOW())";
                $stmt_in = $db_upbit->prepare($insert_sql);
                $stmt_in->execute([
                    ':next_id'    => $next_id,
                    ':new_market' => $final_market,
                    ':k_name'     => $k_name
                ]);
            }

            // ============================================================
            // 4. [자동 갱신 트리거] 데몬 처형 (Kill)
            // 글이 갱신되는 즉시 현재 돌고 있는 데몬을 죽여서 부활 데몬이 새로운 설정을 물고 재실행하도록 유도
            // ============================================================
            
            // 1) DB 깃발 처형 (heartbeat.php와 연동된 안전 종료)
            $db_upbit->query("UPDATE daemon_record SET d_kill_flag = 1 WHERE d_id = 'daemon_bybit_collection'");

            // 2) OS 강제 처형 (즉각적인 프로세스 킬)
            @exec("pkill -f daemon_bybit_collection.php");

        } catch (PDOException $e) {
            // 에러 무시
        }
    }
}
?>