Loading...
Обычное текстовое сообщение без bbcode
php
   // Запускаем единую защищенную транзакцию проверки и выдачи ресурсов 
if ($targetArchId >= 1 && $targetArchId <= 8) {
$checkField = $archMap[$targetArchId];
$requiredVal = (int)$archMap[$targetArchId];
$goldReward = (int)$archMap[$targetArchId];
$silverReward = (int)$archMap[$targetArchId];

$currentProgress = (int)($user[$checkField] ?? 0);
$isAlreadyReceived = (int)($user['arch_' . $targetArchId] ?? 0);

// Валидация 1: Проверка реального достижения условий
if ($currentProgress < $requiredVal) {
header('Location: /arch.php');
exit();
}

// Валидация 2: Проверка на повторное получение
if ($isAlreadyReceived === 1) {
$_SESSION['msg'] = '<div class="text center"><font color="tomato">Вы уже получили награду за это достижение</font></div>';
header('Location: /arch.php');
exit();
}

// АТОМАРНАЯ СУБД-ТРАНЗАКЦИЯ: Выдача наград и фиксация статуса в один неделимый клик
// Условие WHERE arch_X = 0 намертво блокирует уязвимости Race Condition и дюп валюты
$stmtReward = DB::$link->prepare("
UPDATE `users`
SET `gold` = `gold` + :gold,
`crystals` = `crystals` + :silver,
`arch_{$targetArchId}` = 1
WHERE `id` = :id AND `arch_{$targetArchId}` = 0 AND `{$checkField}` >= :req_val
");

$stmtReward->execute([
'gold' => $goldReward,
'silver' => $silverReward,
'id' => $myID,
'req_val' => $requiredVal
]);

if ($stmtReward->rowCount() > 0) {
$_SESSION['msg'] = '<div class="text center"><font color="lime">Награда успешно получена!</font></div>';
} else {
$_SESSION['msg'] = '<div class="text center"><font color="tomato">Ошибка транзакции. Награда уже была выдана.</font></div>';
}

header('Location: /arch.php');
exit();
}
Онлайн: 6
Время:
Gen. 0.0571
(c) Bym.Guru 2010-2026