1 "; $dup_result = sql_query($dup_sql, false); if ($dup_result && sql_num_rows($dup_result)) { while ($dup_row = sql_fetch_array($dup_result)) { echo $dup_row['cp_id']." 의 동일 쿠폰이 중복 사용된 데이터가 있으므로 인덱스 생성이 불가합니다.
"; $sql = " DELETE FROM `{$g5['g5_shop_coupon_log_table']}` WHERE cp_id = '{$dup_row['cp_id']}' AND mb_id = '{$dup_row['mb_id']}' AND cl_id != '{$dup_row['keep_id']}' "; if ($is_admin === 'super') { echo "데이터베이스에서 검토후에 이 쿼리문을 실행해 주세요.
$sql
"; } // sql_query($sql); } } // MyISAM + utf8mb4 환경에서 키 길이 초과 방지: cp_id varchar(100), mb_id varchar(100)으로 조정 sql_query("ALTER TABLE `{$g5['g5_shop_coupon_log_table']}` MODIFY `cp_id` varchar(100) NOT NULL DEFAULT '', MODIFY `mb_id` varchar(100) NOT NULL DEFAULT ''", false); sql_query("ALTER TABLE `{$g5['g5_shop_coupon_log_table']}` ADD UNIQUE KEY `idx_coupon_use` (`cp_id`, `mb_id`)", false); $is_check = true; } } // 자동 로그인 토큰 테이블 생성 (KVE-2026-0610: 추측 가능한 자동 로그인 쿠키 위조 방지) // 다중 디바이스 지원을 위해 회원당 여러 토큰을 별도 테이블로 관리 if (!isset($g5['member_auto_login_table'])) { $g5['member_auto_login_table'] = G5_TABLE_PREFIX.'member_auto_login'; } if (!sql_query(" DESC `{$g5['member_auto_login_table']}` ", false)) { sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['member_auto_login_table']}` ( `al_id` int(11) NOT NULL auto_increment, `mb_id` varchar(20) NOT NULL default '', `al_token` varchar(64) NOT NULL default '', `al_user_agent` varchar(255) NOT NULL default '', `al_ip` varchar(45) NOT NULL default '', `al_created` datetime DEFAULT NULL, `al_last_used` datetime DEFAULT NULL, `al_expire` datetime DEFAULT NULL, PRIMARY KEY (`al_id`), UNIQUE KEY `al_token` (`al_token`), KEY `mb_id` (`mb_id`), KEY `al_expire` (`al_expire`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); $is_check = true; } // KG이니시스 결제 처리 현황 및 단계별 이력 테이블 if (defined('G5_USE_SHOP') && G5_USE_SHOP) { $inicis_pro_config_columns = array( 'de_inicis_pro_alert_use' => "ADD COLUMN `de_inicis_pro_alert_use` tinyint(4) NOT NULL DEFAULT '1'", 'de_inicis_pro_reconcile_use' => "ADD COLUMN `de_inicis_pro_reconcile_use` tinyint(4) NOT NULL DEFAULT '0'", 'de_inicis_pro_log_days' => "ADD COLUMN `de_inicis_pro_log_days` int(11) NOT NULL DEFAULT '365'", 'de_inicis_pro_summary_days' => "ADD COLUMN `de_inicis_pro_summary_days` int(11) NOT NULL DEFAULT '1825'", 'de_inicis_pro_monitor_at' => "ADD COLUMN `de_inicis_pro_monitor_at` datetime DEFAULT NULL", 'de_inicis_pro_monitor_message' => "ADD COLUMN `de_inicis_pro_monitor_message` varchar(255) NOT NULL DEFAULT ''" ); $inicis_pro_config_alter = array(); foreach ($inicis_pro_config_columns as $column => $alter) { $column_result = sql_query(" SHOW COLUMNS FROM `{$g5['g5_shop_default_table']}` LIKE '$column' ", false); if (!$column_result || sql_num_rows($column_result) === 0) $inicis_pro_config_alter[] = $alter; } if (count($inicis_pro_config_alter)) { sql_query(" ALTER TABLE `{$g5['g5_shop_default_table']}` ".implode(', ', $inicis_pro_config_alter), true); $is_check = true; } if (!isset($g5['g5_shop_inicis_pay_table'])) $g5['g5_shop_inicis_pay_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay'; if (!isset($g5['g5_shop_inicis_pay_event_table'])) $g5['g5_shop_inicis_pay_event_table'] = G5_SHOP_TABLE_PREFIX.'inicis_pay_event'; if (!sql_query(" DESC `{$g5['g5_shop_inicis_pay_table']}` ", false)) { sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_inicis_pay_table']}` ( `ip_id` int(11) NOT NULL AUTO_INCREMENT, `ip_oid` varchar(64) NOT NULL DEFAULT '', `ip_tid` varchar(80) NOT NULL DEFAULT '', `ip_auth_tid` varchar(80) NOT NULL DEFAULT '', `ip_mid` varchar(80) NOT NULL DEFAULT '', `ip_environment` varchar(10) NOT NULL DEFAULT '', `mb_id` varchar(20) NOT NULL DEFAULT '', `ip_amount` int(11) NOT NULL DEFAULT '0', `ip_pay_type` varchar(20) NOT NULL DEFAULT '', `ip_easy_pay` varchar(20) NOT NULL DEFAULT '', `ip_device` varchar(10) NOT NULL DEFAULT '', `ip_order_type` varchar(10) NOT NULL DEFAULT '', `ip_status` varchar(30) NOT NULL DEFAULT '', `ip_result_code` varchar(30) NOT NULL DEFAULT '', `ip_result_message` varchar(255) NOT NULL DEFAULT '', `ip_noti_status` varchar(30) NOT NULL DEFAULT '', `ip_noti_code` varchar(30) NOT NULL DEFAULT '', `ip_noti_message` varchar(255) NOT NULL DEFAULT '', `ip_noti_failed_count` int(11) NOT NULL DEFAULT '0', `ip_noti_at` datetime DEFAULT NULL, `ip_cancel_status` varchar(30) NOT NULL DEFAULT '', `ip_cancel_code` varchar(30) NOT NULL DEFAULT '', `ip_cancel_message` varchar(255) NOT NULL DEFAULT '', `ip_cancel_checked_at` datetime DEFAULT NULL, `ip_refund_required` tinyint(4) NOT NULL DEFAULT '0', `ip_vbank_due_at` datetime DEFAULT NULL, `ip_expired_at` datetime DEFAULT NULL, `ip_order_exists` tinyint(4) NOT NULL DEFAULT '0', `ip_approved_at` datetime DEFAULT NULL, `ip_ordered_at` datetime DEFAULT NULL, `ip_notified_at` datetime DEFAULT NULL, `ip_canceled_at` datetime DEFAULT NULL, `ip_created_at` datetime DEFAULT NULL, `ip_updated_at` datetime DEFAULT NULL, `ip_ip` varchar(45) NOT NULL DEFAULT '', `ip_event_count` int(11) NOT NULL DEFAULT '0', `ip_audit_error` tinyint(4) NOT NULL DEFAULT '0', `ip_alerted_at` datetime DEFAULT NULL, `ip_alert_key` varchar(64) NOT NULL DEFAULT '', `ip_pg_status` varchar(30) NOT NULL DEFAULT '', `ip_pg_amount` int(11) NOT NULL DEFAULT '0', `ip_pg_tid` varchar(80) NOT NULL DEFAULT '', `ip_pg_result_code` varchar(30) NOT NULL DEFAULT '', `ip_pg_message` varchar(255) NOT NULL DEFAULT '', `ip_pg_checked_at` datetime DEFAULT NULL, PRIMARY KEY (`ip_id`), UNIQUE KEY `ip_oid` (`ip_oid`), KEY `ip_tid` (`ip_tid`), KEY `ip_auth_tid` (`ip_auth_tid`), KEY `ip_status` (`ip_status`), KEY `ip_noti_status` (`ip_noti_status`), KEY `ip_cancel_status` (`ip_cancel_status`), KEY `ip_refund_required` (`ip_refund_required`), KEY `ip_updated_at` (`ip_updated_at`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); $is_check = true; } if (sql_query(" DESC `{$g5['g5_shop_inicis_pay_table']}` ", false)) { $inicis_pay_columns = array( 'ip_environment' => "ADD COLUMN `ip_environment` varchar(10) NOT NULL DEFAULT '' AFTER `ip_mid`", 'ip_easy_pay' => "ADD COLUMN `ip_easy_pay` varchar(20) NOT NULL DEFAULT '' AFTER `ip_pay_type`", 'ip_noti_status' => "ADD COLUMN `ip_noti_status` varchar(30) NOT NULL DEFAULT '' AFTER `ip_result_message`", 'ip_noti_code' => "ADD COLUMN `ip_noti_code` varchar(30) NOT NULL DEFAULT '' AFTER `ip_noti_status`", 'ip_noti_message' => "ADD COLUMN `ip_noti_message` varchar(255) NOT NULL DEFAULT '' AFTER `ip_noti_code`", 'ip_noti_failed_count' => "ADD COLUMN `ip_noti_failed_count` int(11) NOT NULL DEFAULT '0' AFTER `ip_noti_message`", 'ip_noti_at' => "ADD COLUMN `ip_noti_at` datetime DEFAULT NULL AFTER `ip_noti_failed_count`", 'ip_cancel_status' => "ADD COLUMN `ip_cancel_status` varchar(30) NOT NULL DEFAULT '' AFTER `ip_noti_at`", 'ip_cancel_code' => "ADD COLUMN `ip_cancel_code` varchar(30) NOT NULL DEFAULT '' AFTER `ip_cancel_status`", 'ip_cancel_message' => "ADD COLUMN `ip_cancel_message` varchar(255) NOT NULL DEFAULT '' AFTER `ip_cancel_code`", 'ip_cancel_checked_at' => "ADD COLUMN `ip_cancel_checked_at` datetime DEFAULT NULL AFTER `ip_cancel_message`", 'ip_refund_required' => "ADD COLUMN `ip_refund_required` tinyint(4) NOT NULL DEFAULT '0' AFTER `ip_cancel_checked_at`", 'ip_vbank_due_at' => "ADD COLUMN `ip_vbank_due_at` datetime DEFAULT NULL AFTER `ip_refund_required`", 'ip_expired_at' => "ADD COLUMN `ip_expired_at` datetime DEFAULT NULL AFTER `ip_vbank_due_at`", 'ip_audit_error' => "ADD COLUMN `ip_audit_error` tinyint(4) NOT NULL DEFAULT '0'", 'ip_alerted_at' => "ADD COLUMN `ip_alerted_at` datetime DEFAULT NULL", 'ip_alert_key' => "ADD COLUMN `ip_alert_key` varchar(64) NOT NULL DEFAULT ''", 'ip_pg_status' => "ADD COLUMN `ip_pg_status` varchar(30) NOT NULL DEFAULT ''", 'ip_pg_amount' => "ADD COLUMN `ip_pg_amount` int(11) NOT NULL DEFAULT '0'", 'ip_pg_tid' => "ADD COLUMN `ip_pg_tid` varchar(80) NOT NULL DEFAULT ''", 'ip_pg_result_code' => "ADD COLUMN `ip_pg_result_code` varchar(30) NOT NULL DEFAULT ''", 'ip_pg_message' => "ADD COLUMN `ip_pg_message` varchar(255) NOT NULL DEFAULT ''", 'ip_pg_checked_at' => "ADD COLUMN `ip_pg_checked_at` datetime DEFAULT NULL" ); $inicis_pay_alter = array(); foreach ($inicis_pay_columns as $column => $alter) { $column_result = sql_query(" SHOW COLUMNS FROM `{$g5['g5_shop_inicis_pay_table']}` LIKE '$column' ", false); if (!$column_result || sql_num_rows($column_result) === 0) $inicis_pay_alter[] = $alter; } if (count($inicis_pay_alter)) { sql_query(" ALTER TABLE `{$g5['g5_shop_inicis_pay_table']}` ".implode(', ', $inicis_pay_alter), true); $is_check = true; } if (count($inicis_pay_alter)) { $environment = !empty($default['de_card_test']) ? 'test' : 'live'; sql_query(" insert ignore into `{$g5['g5_shop_inicis_pay_table']}` (ip_oid, ip_environment, ip_status, ip_noti_status, ip_noti_code, ip_noti_message, ip_noti_failed_count, ip_noti_at, ip_created_at, ip_updated_at, ip_event_count) select e.ip_oid, '$environment', e.pe_status, e.pe_status, e.pe_code, e.pe_message, sum(if(e.pe_status = 'notification_failed', 1, 0)), max(e.pe_created_at), min(e.pe_created_at), max(e.pe_created_at), count(*) from `{$g5['g5_shop_inicis_pay_event_table']}` e left join `{$g5['g5_shop_inicis_pay_table']}` p on p.ip_oid = e.ip_oid where p.ip_id is null and e.pe_stage = 'notification' group by e.ip_oid ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` set ip_environment = case when lower(ip_mid) in ('inipaytest','iniescrow0') then 'test' when ip_mid <> '' then 'live' else '$environment' end where ip_environment = '' ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p inner join ( select ip_oid, max(pe_id) as pe_id, sum(if(pe_status = 'notification_failed', 1, 0)) as fail_count from `{$g5['g5_shop_inicis_pay_event_table']}` where pe_stage = 'notification' group by ip_oid ) x on x.ip_oid = p.ip_oid inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.pe_id = x.pe_id set p.ip_noti_status = e.pe_status, p.ip_noti_code = e.pe_code, p.ip_noti_message = e.pe_message, p.ip_noti_failed_count = x.fail_count, p.ip_noti_at = e.pe_created_at ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p inner join ( select ip_oid, max(pe_id) as pe_id from `{$g5['g5_shop_inicis_pay_event_table']}` where pe_stage = 'cancel' group by ip_oid ) x on x.ip_oid = p.ip_oid inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.pe_id = x.pe_id set p.ip_cancel_status = e.pe_status, p.ip_cancel_code = e.pe_code, p.ip_cancel_message = e.pe_message, p.ip_cancel_checked_at = e.pe_created_at ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.ip_oid = p.ip_oid and e.pe_stage = 'request' set p.ip_easy_pay = case when e.pe_message like '삼성페이%' then 'SAMSUNGPAY' when e.pe_message like 'lpay%' then 'LPAY' when e.pe_message like 'inicis_kakaopay%' then 'KAKAOPAY' when e.pe_message like '간편결제%' then 'EASYPAY' else p.ip_easy_pay end where p.ip_easy_pay = '' ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` set ip_noti_status = case when ip_status = 'paid' then 'paid' when ip_status = 'vbank_issued' then 'vbank_issued' when ip_status = 'notification_received' then 'notification_received' else ip_noti_status end, ip_cancel_status = case when ip_status in ('canceled','cancel_failed','partial_canceled','partial_cancel_failed') then ip_status else ip_cancel_status end ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p inner join {$g5['g5_shop_order_table']} o on o.od_id = p.ip_oid set p.ip_status = 'paid_after_cancel', p.ip_refund_required = '1', p.ip_noti_status = 'paid_after_cancel', p.ip_noti_message = '취소 주문에 가상계좌 입금 확인' where p.ip_pay_type = 'VBANK' and p.ip_status = 'paid' and o.od_status = '취소' and o.od_receipt_price > 0 ", false); $inicis_pro_migrated_at = G5_TIME_YMDHIS; $inicis_pro_migrated_message = '기존 결제·주문 이력 대조에서 취소 후 입금 확인'; sql_query(" insert into `{$g5['g5_shop_inicis_pay_event_table']}` (ip_oid, ip_tid, pe_stage, pe_status, pe_code, pe_message, pe_source, pe_ip, pe_created_at) select p.ip_oid, p.ip_tid, 'reconcile', 'paid_after_cancel', '', '".sql_escape_string($inicis_pro_migrated_message)."', 'system', '', '$inicis_pro_migrated_at' from `{$g5['g5_shop_inicis_pay_table']}` p left join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.ip_oid = p.ip_oid and e.pe_status = 'paid_after_cancel' where p.ip_status = 'paid_after_cancel' and p.ip_refund_required = '1' and e.pe_id is null ", false); sql_query(" update `{$g5['g5_shop_inicis_pay_table']}` p inner join `{$g5['g5_shop_inicis_pay_event_table']}` e on e.ip_oid = p.ip_oid and e.pe_status = 'paid_after_cancel' and e.pe_message = '".sql_escape_string($inicis_pro_migrated_message)."' and e.pe_created_at = '$inicis_pro_migrated_at' set p.ip_event_count = p.ip_event_count + 1 ", false); } $inicis_pay_indexes = array( 'ip_noti_status' => "ADD KEY `ip_noti_status` (`ip_noti_status`)", 'ip_cancel_status' => "ADD KEY `ip_cancel_status` (`ip_cancel_status`)", 'ip_refund_required' => "ADD KEY `ip_refund_required` (`ip_refund_required`)" ); foreach ($inicis_pay_indexes as $index_name => $index_sql) { $index_result = sql_query(" SHOW INDEX FROM `{$g5['g5_shop_inicis_pay_table']}` WHERE Key_name = '$index_name' ", false); if (!$index_result || sql_num_rows($index_result) === 0) { sql_query(" ALTER TABLE `{$g5['g5_shop_inicis_pay_table']}` $index_sql ", true); $is_check = true; } } } if (!sql_query(" DESC `{$g5['g5_shop_inicis_pay_event_table']}` ", false)) { sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['g5_shop_inicis_pay_event_table']}` ( `pe_id` int(11) NOT NULL AUTO_INCREMENT, `ip_oid` varchar(64) NOT NULL DEFAULT '', `ip_tid` varchar(80) NOT NULL DEFAULT '', `pe_stage` varchar(30) NOT NULL DEFAULT '', `pe_status` varchar(30) NOT NULL DEFAULT '', `pe_code` varchar(30) NOT NULL DEFAULT '', `pe_message` varchar(255) NOT NULL DEFAULT '', `pe_source` varchar(10) NOT NULL DEFAULT '', `pe_ip` varchar(45) NOT NULL DEFAULT '', `pe_created_at` datetime DEFAULT NULL, PRIMARY KEY (`pe_id`), KEY `ip_oid` (`ip_oid`), KEY `ip_tid` (`ip_tid`), KEY `pe_status` (`pe_status`), KEY `pe_created_at` (`pe_created_at`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); $is_check = true; } } $is_check = run_replace('admin_dbupgrade', $is_check); $db_upgrade_msg = $is_check ? 'DB 업그레이드가 완료되었습니다.' : '더 이상 업그레이드 할 내용이 없습니다.
현재 DB 업그레이드가 완료된 상태입니다.'; ?>