View sourcecode

The following files exists in this folder. Click to view.

match.php

78 lines ASCII Windows (CRLF)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?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());
}