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 업그레이드가 완료된 상태입니다.';
?>