Sixtens hemsida Uppgifter Blogg Om

Bankapplikation med databas

Gå till sida

Källkod

bank_sql/

logout.php

transfer.php

index.php

login.php

manage.php

signup.php

change_password.php

PREP/

POPULATE.php

QUERIES.sql

modules/

user.php

page.php

database.php

session.php

utility.php

wesweb01/bank_sql/index.php

1 lines
<?php
# Startsida för banken. Visas endast när man är inloggad.

# Importerar moduler
require "modules/session.php";
require 
"modules/page.php";
Session::Init(); # Initierar sessionen.
Session::RedirectIfNotLoggedIn(); # Omdirigerar en till inloggningssidan ifall man inte är inloggad.
$user Session::GetUser(); # Hämtar ett användarobjekt utifrån ens användar-id från sessionen.
$mainAccount $user->getMainAccount(); # Hämtar huvudkontot för användaren.
# Huvudkontot är det konto som externa transaktioner, insättningar och uttag sker ifrån. Det går inte att radera.

# Denna sorts inledning är till stor del gemensam för alla sidor, så därför kommenteras den endast i denna fil.

$maxDeposit 1000000# Maxinsättning.

function try_deposit_withdraw($type$amount): RequestResult
# Funktion för att försöka göra en insättning eller uttag från konto.
# Observera att alla funtkioner som börjar på try följer samma mönster, där den validerar användarinput.
# RequestResult är en egendefinerad klass som både innehåller ett meddelande, samt en boolean som avgör ifall det var lyckat eller ej.
# Används för att visa meddelande till användare, samt eventuellt hantera logik beroende på resultatet.
{
    global 
$user$mainAccount$maxDeposit;

    
$intAmount intval($amount);
    if (
$intAmount <= 0# Ifall man anger ett värde under 0 misslyckas uttaget/insättningen.
        
return new RequestResult(false"Angedda summan pengar får ej underskrida 0 kr.");
    switch (
$type) {
        case 
"deposit":
            if (
$intAmount $maxDeposit# Ifall man anger en summa större än gränsen misslyckas insättningen.
                
return new RequestResult(false"Angedda summan pengar får ej överskrida {$maxDeposit} kr.");
            
$user->logDeposit($intAmount); # Spara insättning.
            
$mainAccount->rereadValues(); # Ser till att saldot läses om.
            
return new RequestResult(true"Satte in {$intAmount} kr på {$mainAccount->name}!");
        case 
"withdraw":
            
$balance $mainAccount->balance;
            if (
$intAmount $balance# Ifall man anger en summa större än man har misslyckas uttaget.
                
return new RequestResult(false"Angedda summan pengar får ej överskrida {$balance} kr.");
            
$user->logWithdrawal($intAmount); # Spara uttagning.
            
$mainAccount->rereadValues(); # Ser till att saldot läses om.
            
return new RequestResult(true"Tog ut {$intAmount} kr från {$mainAccount->name}!");
        default: 
# Ifall användaren angett felaktig metod.
            
return new RequestResult(false"Fel metod: {$type}.");
    }
}

$result null;
if (isset(
$_POST["transaction-type"]) && isset($_POST["amount"])) { # Här kör vi våran try metod ifall användaren begär det.
    
$result try_deposit_withdraw($_POST["transaction-type"], $_POST["amount"]);
}

if (isset(
$_GET["action"])) {
    switch (
$_GET["action"]) {
        case 
"create_account":
            
# Den här koden körs ifall användaren klickar på skapa (bank)konto.
            # Helst hade jag velat använda POST för det här, men det hade blivit konstigt att använda formulär för det.
            
$user->createAccount("Nytt konto");
            break;
        default:
    }
    
header("location: index.php");
}
?>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Banken</title>
    <link rel="stylesheet" type="text/css" href="../css/materialize.css">
    <script defer type="text/javascript" src="../js/materialize.js"></script>
</head>

<body>
    <?php print_navbar() # Skriver ut navbar. Finns i alla filer. ?>
    <div class="container row">
        <?php
        
echo "<h1>Välkommen, {$user->username}!</h1>";
        
?>
        <div class="row">
            <div class="col s12 m6">
                <div class="card grey lighten-3">
                    <div class="card-content">
                        <span class="card-title"><b>Mina konton</b></span>
                        <div class="card-action">
                            <ul class="collection ">
                                <?php
                                
# Här går vi igenom varje konto som användaren har och visar namn på konto, samt saldo.
                                
$i 0;
                                foreach (
$user->accounts as $account) {
                                    if (!
$account->isActive)
                                        continue;
                                    
$colorChange $i == "2" "1"# Sak för att göra varannan färg ljus- respektive mörkgrå.
                                    
echo "<li class=\"collection-item grey lighten-{$colorChange} row\">
                                    <a href=\"manage.php?account=
{$account->accountId}\" class=\"btn right blue-grey darken\">Hantera</a>
                                    <p class=\"right\">&nbsp;&nbsp;</p>
                                    <a href=\"transfer.php?account=
{$account->accountId}\" class=\"btn right blue-grey darken\">Överför från</a>
                                    <p><b>
{$account->name}</b><br>{$account->balance} kr</p>
                                    </li>"
;
                                    
$i++;
                                }
                                
?>
                            </ul>
                        </div>
                        <a class="btn blue-grey darken" href="?action=create_account">Skapa nytt konto</a>
                    </div>
                </div>
            </div>
            <div class="col s12 m6">
                <div class="card grey lighten-3">
                    <div class="card-content">
                        <span class="card-title"><b>Insättning/uttag</b></span>
                        <div class="card-action">
                            <?php
                            
# Skriver ut eventuellt meddelande angående insättning/uttag.
                            
if (isset($result))
                                echo 
"<p><b>{$result->message}</b></p><br>";
                            
?>
                            <form method="POST" id="deposit-withdrawal-form">
                                <p>
                                    <label>
                                        <input class="with-gap" name="transaction-type" value="deposit" id="deposit"
                                            type="radio" required />
                                        <span>Insättning</span>
                                    </label>
                                </p>
                                <p>
                                    <label>
                                        <input class="with-gap" name="transaction-type" value="withdraw" id="withdraw"
                                            type="radio" required />
                                        <span>Uttag</span>
                                    </label>
                                </p>
                                <br>
                                <div class="form-show-selected" hidden>
                                    <p id="deposit-withdrawal-info"></p>
                                    <div class="row">
                                        <p class="col s6">
                                            <label for="amount">Summa: </label>
                                            <input type="number" name="amount" id="amount" class="validate" required
                                                value="0" min="1" />
                                        </p>
                                    </div>
                                    <p>
                                        <input class="btn blue-grey darken" type="submit" value="Sätt in pengar">
                                    </p>
                                </div>

                                <script>
                                    // Detta script ser till att formuläret för insättning och uttag är lite interaktivt.
                                    var depositButton = document.getElementById("deposit");
                                    var withdrawButton = document.getElementById("withdraw");

                                    var accountName = <?php echo "\"{$mainAccount->name}\""?>;
                                    var maxWithdraw = <?php echo $mainAccount->balance?>;
                                    var maxDeposit = <?php echo $maxDeposit?>;

                                    var form = document.getElementById("deposit-withdrawal-form");
                                    var submit = form.querySelector("input[type='submit']");
                                    var amount = document.getElementById("amount");
                                    var infoLabel = document.getElementById("deposit-withdrawal-info");

                                    var hidden = true;

                                    function setState(deposit) {
                                        infoLabel.innerText = (deposit ? "Sätter in på: " : "Tar ut från: ") + accountName;
                                        submit.value = deposit ? "Sätt in pengar" : "Ta ut pengar";
                                        amount.setAttribute("max", deposit ? maxDeposit : maxWithdraw);

                                        if (!hidden) return;
                                        form.querySelector(".form-show-selected").removeAttribute("hidden");
                                        hidden = false;
                                    }

                                    depositButton.addEventListener("change", function () {
                                        if (depositButton.checked)
                                            setState(true);
                                    });
                                    withdrawButton.addEventListener("change", function () {
                                        if (withdrawButton.checked)
                                            setState(false);
                                    });
                                </script>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>

</html>