The following files exists in this folder. Click to view.
match.php78 lines ASCII Windows (CRLF) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
<?php
require "auth.php";
require "database.php";
requireLogin();
$ladderID = $_POST["ladder_id"];
$player1 = $_SESSION["player_id"];
$player2 = $_POST["opponent_id"];
$winner = $_POST["winner_id"];
try {
$conn->beginTransaction();
// lock scores
$stmt = $conn->prepare("
SELECT PlayerID, CurrentScore
FROM LadderPlayers
WHERE LadderID = ? AND PlayerID IN (?, ?)
FOR UPDATE
");
$stmt->execute([$ladderID, $player1, $player2]);
$scores = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
if (count($scores) !== 2) {
throw new Exception("Players not in ladder");
}
$p1Score = $scores[$player1];
$p2Score = $scores[$player2];
$loser = ($winner == $player1) ? $player2 : $player1;
$transfer = round($scores[$loser] * 0.10);
$newScores = [
$winner => $scores[$winner] + $transfer,
$loser => $scores[$loser] - $transfer
];
// update the scores
foreach ($newScores as $pid => $score) {
$stmt = $conn->prepare("
UPDATE LadderPlayers
SET CurrentScore = ?
WHERE PlayerID = ? AND LadderID = ?
");
$stmt->execute([$score, $pid, $ladderID]);
}
// record match
$stmt = $conn->prepare("
INSERT INTO Matches (
LadderID, Player1ID, Player2ID, WinnerID,
Player1ScoreBefore, Player2ScoreBefore,
Player1ScoreAfter, Player2ScoreAfter,
SubmittedByID
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
$ladderID,
$player1,
$player2,
$winner,
$p1Score,
$p2Score,
$newScores[$player1],
$newScores[$player2],
$player1
]);
$conn->commit();
header("Location: ladder.php?id=$ladderID");
exit;
} catch (Exception $e) {
$conn->rollBack();
die("ERROR: " . $e->getMessage());
}