Вход Регистрация
Файл: pages/clan/clanzayavs.php
Строк: 134
<?php
/* Заявки в клан: безопасная обработка POST+CSRF, by Метриум (Стэлп) */
declare(strict_types=1);
// Physical module map v50.6: public URL stays clean while code lives in /pages.
if (!defined('GAME_ROOT')) define('GAME_ROOT'dirname(__DIR__2));
chdir(GAME_ROOT);
if (
PHP_SAPI !== 'cli') { $_SERVER['PHP_SELF']='/clanzayavs.php'$_SERVER['SCRIPT_NAME']='/clanzayavs.php'; }

$title='Заявки в клан';
require_once 
'./system/common.php';
require_once 
'./system/functions.php';
require_once 
'./system/user.php';
if(!
$user){ header('Location:/'); exit; }
if(!
$clan || !$clan_memb || (int)($clan_memb['rank']??0)<4){ $_SESSION['err']='Заявки доступны лидеру и заместителю клана.'header('Location:/clan/'); exit; }
$cid=(int)$clan['id']; $uid=(int)$user['id'];
if((
$_SERVER['REQUEST_METHOD']??'GET')==='POST'){
    
security_require_csrf();
    
$appUser=max(0,(int)($_POST['user']??0)); $act=(string)($_POST['act']??'');
    if(
$appUser>&& in_array($act,['accept','reject'],true)){
        
$row=db_fetch_one('SELECT `user`,`clan` FROM `clan_z` WHERE `user`=:u AND `clan`=:c LIMIT 1',['u'=>$appUser,'c'=>$cid]);
        if(!
$row){ $_SESSION['err']='Заявка уже обработана.'; }
        elseif(
$act==='reject'){
            
db_execute('DELETE FROM `clan_z` WHERE `user`=:u AND `clan`=:c',['u'=>$appUser,'c'=>$cid]);
            
$_SESSION['ok']='Заявка отклонена.';
        }else{
            
$pdo=db_pdo();
            try{
                
$pdo->beginTransaction();
                
$st=$pdo->prepare('SELECT `id` FROM `clan_memb` WHERE `user`=? FOR UPDATE'); $st->execute([$appUser]);
                if(
$st->fetch()){ throw new RuntimeException('Игрок уже состоит в клане.'); }
                
$st=$pdo->prepare('SELECT `user` FROM `clan_z` WHERE `user`=? AND `clan`=? FOR UPDATE'); $st->execute([$appUser,$cid]);
                if(!
$st->fetch()){ throw new RuntimeException('Заявка уже обработана.'); }
                
$now=time();
                
$st=$pdo->prepare('INSERT INTO `clan_memb` (`clan`,`user`,`time`,`last_update`) VALUES (?,?,?,?)'); $st->execute([$cid,$appUser,$now,$now+86400]);
                
$st=$pdo->prepare('DELETE FROM `clan_z` WHERE `user`=?'); $st->execute([$appUser]);
                
$applicant=$pdo->prepare('SELECT `login`,`r` FROM `users` WHERE `id`=?'); $applicant->execute([$appUser]); $ap=$applicant->fetch(PDO::FETCH_ASSOC)?:['login'=>'Игрок','r'=>0];
                
$journal='<img src=/images/icon/race/'.(int)$ap['r'].'.png> '.strip_tags((string)$ap['login']).' принят в клан';
                
$st=$pdo->prepare('INSERT INTO `clan_journal` (`cl_id`,`text`,`time`) VALUES (?,?,?)');
                
$st->execute([$cid,$journal,$now]);
                
$pdo->commit(); $_SESSION['ok']='Игрок принят в клан.';
            }catch(
Throwable $e){ if($pdo->inTransaction())$pdo->rollBack(); $_SESSION['err']=$e instanceof RuntimeException?$e->getMessage():'Не удалось принять игрока.'; }
        }
        
header('Location:/clan/application/'); exit;
    }
}
require_once 
'./system/h.php';
$q=db_prepare('SELECT z.`user`,u.`login`,u.`r`,u.`level`,u.`online` FROM `clan_z` z INNER JOIN `users` u ON u.`id`=z.`user` WHERE z.`clan`=:c ORDER BY z.`user` DESC',['c'=>$cid]);
$rows=$q->fetchAll(PDO::FETCH_ASSOC);
?>
<div class="block_zero center"><b>Заявки в клан</b><br><span class="grey">Ожидают решения: <?=n_f(count($rows))?></span></div>
<div class="mini-line"></div>
<?php if(!$rows): ?>
<div class="block_light center grey">Новых заявок пока нет.</div>
<?php else: foreach($rows as $r): ?>
<div class="block_light">
<img src="/images/icon/race/<?=(int)$r['r']?>.png" alt=""> <a href="/user/<?=(int)$r['user']?>/"><?=security_html($r['login'])?></a> <span class="grey">ур. <?=(int)$r['level']?></span>
<div class="separ"></div>
<form method="post" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="user" value="<?=(int)$r['user']?>"><button class="btn" type="submit" name="act" value="accept"><span class="end"><span class="label">Принять</span></span></button></form>
<form method="post" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="user" value="<?=(int)$r['user']?>"><button class="link-button grey" type="submit" name="act" value="reject">Отклонить</button></form>
</div><div class="mini-line"></div>
<?php endforeach; endif; ?>
<div class="menuList"><li><a href="/clan/"><img src="/images/icon/arrow.png" alt="">Вернуться в клан</a></li></div>
<?php require_once './system/f.php'?>
Онлайн: 3
Реклама