beginTransaction(); // Vérifie si le user possède déjà un item $stmt = $pdo->prepare("SELECT ui.id, i.name FROM user_items ui JOIN items i ON ui.item_id = i.id WHERE ui.user_id = :uid LIMIT 1 FOR UPDATE"); $stmt->execute([':uid' => $user_id]); $existing = $stmt->fetch(); if ($existing) { $pdo->rollBack(); exit("Tu possèdes déjà un item actif : " . htmlspecialchars($existing['name'])); } // Récupère item $stmt = $pdo->prepare("SELECT id, name, price FROM items WHERE id = :id FOR UPDATE"); $stmt->execute([':id' => $item_id]); $item = $stmt->fetch(); if (!$item) { $pdo->rollBack(); exit('Item introuvable.'); } $total = (int)$item['price']; // Vérifie aura $stmt = $pdo->prepare("SELECT aura FROM users WHERE id = :uid FOR UPDATE"); $stmt->execute([':uid' => $user_id]); $u = $stmt->fetch(); if (!$u) { $pdo->rollBack(); exit('Utilisateur introuvable.'); } $aura = (int)$u['aura']; if ($aura < $total) { $pdo->rollBack(); exit('Tu n\'as pas assez d\'aura pour cet achat.'); } // Débite l'aura $stmt = $pdo->prepare("UPDATE users SET aura = aura - :amt WHERE id = :uid"); $stmt->execute([':amt' => $total, ':uid' => $user_id]); // Ajoute item à user_items $stmt = $pdo->prepare("INSERT INTO user_items (user_id, item_id) VALUES (:uid, :iid)"); $stmt->execute([':uid' => $user_id, ':iid' => $item_id]); // Log (version simplifiée, sans actor_discord_id ni type) $stmt = $pdo->prepare("INSERT INTO logs (user_id, amount, reason) VALUES (:uid, :amount, :reason)"); $stmt->execute([ ':uid' => $user_id, ':amount' => -$total, ':reason' => 'Achat: ' . $item['name'] ]); $pdo->commit(); header('Location: shop.php?buy=ok'); exit; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); echo "Erreur détaillée : " . $e->getMessage(); var_dump($item_id, $user_id, $total, $aura); exit; }