Sähköisten asiointipalveluiden toteuttaminen

Sorakuilu

Refaktorointi

Demossa muodostui paljon controller-tiedostoja. Luonnollinen muutoskohta on siirtää ne samaan tiedostoon ja tehdä niistä yksi luokka. Tässä kohtaa yksi luokka on hyvä vaihtoehto, mutta jos käsittelisimme useita tauluja, kannattaisi tehdä taulukohtaisia (olio) kontrollereita.

Samalla muutetaan Player.php Player-luokaksi.

Alla olevissa esimerkeissä on tehty vain staattisia (luokkakohtaisia muutujia) jolloin olion luominen ei ole tarpeen. Mikään ei estä tekemästä myös oliota ja kutsumasta sitä
Muutoksia on tehty siis kolmeen paikkaan: reitteihin eli index.php:hen, Player.php:hen ja kontrollereihin, joista on tehty yksi luokka.

index.php

<?php
session_start
();
//pyynnöt on muotoa index.php?action=edit&id=5
require "./helpers/auth.php";
require 
"./controllers/PlayerController.php";

$playerController=new PlayerController();


if(isset(
$_GET["action"])) $action $_GET["action"];
else 
$action "index"//index on kotisivu
$method strtolower($_SERVER['REQUEST_METHOD']);

switch(
$action) {
    case 
"index":
    
//$playerController->index(); tai koska funktiot staattisia
    
PlayerController::index();
    break;

    case 
"addplayer":
    if(
$method =="get") require "./views/addplayerform.view.php";
    else 
$playerController->postaddplayer();
    break;

    case 
"login":
    if(
$method=="get") require "./views/loginform.view.php";
    else 
$playerController->postlogin();
    break;

    case 
"logout":
    if(
isAuthenticated()) {
        
$playerController->logout();
    }
    else 
$playerController->index();
    break;

    case 
"delete":
    if(
isAuthenticated()) {
        
$playerController->deletePlayer();
    } else require 
"./views/loginform.view.php";
    break;

    case 
"edit":
    if(
isAuthenticated()) {
        if(
$method == "get"$playerController->geteditplayer();
        else require 
$playerController->posteditplayer();
    } else require 
"./views/loginform.view.php";
    break;

    case 
"admin":
    if(
isAuthenticated()) {
        
$playerController->admin();
    } else require 
"./views/loginform.view.php";    
    break;


    default:
    echo 
"404";
 }

Player.php

<?php
require "./database/connection.php";

class 
Player
{
    public function 
__construct() 
    {

    }
    
    
    public static function 
loginPlayer($account_name,$password)
    {
        global 
$pdo;   
        
$sql "SELECT id,account_name,password FROM players WHERE account_name = ?";

        
$stm $pdo->prepare($sql);
        
$stm->bindValue(1,$account_name);
        
$stm->execute();

        
$player $stm->fetchAll(PDO::FETCH_CLASS);
        
var_dump($player);
        echo 
$player[0]->password;
        if(
password_verify($password,$player[0]->password)) {
            return 
TRUE;
        }
        else return 
FALSE;
    }

    public static function 
getAllPlayers()
    {
        global 
$pdo;
        
$sql "SELECT id,account_name FROM players";
        
$stm $pdo->query($sql); 
        
        
$players $stm->fetchAll(PDO::FETCH_CLASS);
        return 
$players;
    }

    public static function 
addPlayer($data)
    {
        global 
$pdo;
        
$sql "INSERT INTO players(account_name,password,email,last_login,online,money,current_character,banned) VALUES (?,?,?,?,?,?,?,?)";

        
$stm $pdo->prepare($sql);
        
$stm->execute($data);

        return 
$pdo->lastInsertId();
    }

    public static function 
deletePlayer($id)
    {
        global 
$pdo;
        
$sql "DELETE FROM players WHERE id = ?";

        
$stm $pdo->prepare($sql);
        
$stm->bindValue(1$id);
        
$stm->execute();
    }

    public static function 
getPlayerById($id//hakee yhden pelaajan tiedot
    
{
        global 
$pdo;
        
$sql "SELECT * FROM players WHERE id = ?";

        
$stm $pdo->prepare($sql);
        
$stm->bindValue(1$id);
        
$stm->execute();

        
$player $stm->fetchAll(PDO::FETCH_CLASS);
        return 
$player;
    }

    public static function 
getPlayerByName($account_name)
    {
        global 
$pdo;
        
$sql "SELECT * FROM players WHERE account_name = ?";

        
$stm $pdo->prepare($sql);
        
$stm->bindValue(1$account_name);
        
$stm->execute();

        
$player $stm->fetchAll(PDO::FETCH_CLASS);
        return 
$player;
    }




    public static function 
editPlayer($data)
    {
        global 
$pdo;
        
$sql "UPDATE players SET account_name = ?, email = ?, money = ?,current_character = ?,banned = ? WHERE id = ?";

        
$stm $pdo->prepare($sql);
        return 
$stm->execute($data);    
    }
}

Ja lisätty PlayerController.php

<?php
require "./helpers/helper.php";
require 
"./database/models/Player.php";


class 
PlayerController
{
    private 
$player;
    
    public function 
__construct() 
    {
        
$this->player = new Player();
    }
    
    public static function 
index()
    {
        
$players Player::getAllPlayers();
        require 
"./views/index.view.php";
    }
    
    public static function 
admin()
    {
        
$players Player::getAllPlayers();
        require 
"./views/admin.view.php";
    }
    
  
    public static function 
deletePlayer()
    {    
        
$players Player::getAllPlayers();
        
        if(isset(
$_GET["id"])) {
            
$id$_GET["id"];
            
Player::deletePlayer($id);
            require 
"./views/admin.view.php";
        }
        else {
            
$message ="Poistaminen ei onnistu";
            require 
"./views/admin.view.php";   
        }
    }
    
    public static function 
geteditplayer()
    {
        if(isset(
$_GET["id"])) {
            
$id $_GET["id"];
            
$player Player::getPlayerById($id);
            require 
"./views/editplayerform.view.php";
        }
    }
    
    public static function 
logout()
    {
        
$players Player::getAllPlayers();

        if(isset(
$_SESSION["ip"],$_SESSION["id"]))
        {
            
session_unset(); //poistaa kaikki muuttujat
            
session_destroy();
            require 
"./views/index.view.php";
        }
        else require 
"./views/index.view.php";
    }
    
    public static function 
postaddplayer()
    {
        if(isset(
$_POST["aname"],$_POST["passwd"],$_POST["passwd2"],$_POST["email"],$_POST["character"]) && $_POST["passwd"] == $_POST["passwd2"]) {
            
$name sanit($_POST["aname"]);
            
$passu sanit($_POST["passwd"]);
            
$passu password_hash($passu,PASSWORD_DEFAULT);
            
$email sanit($_POST["email"]);
            
$character sanit($_POST["character"]);
            
$last_login date('Y-m-d');


            
//(account_name,password,email,last_login,online,money,current_character,banned)

            
$data = array($name,$passu,$email,$last_login,1,500,$character,0);
            
//var_dump($data);
            
$id Player::addPlayer($data);
            
$message "Lisätty uusi pelaaja, id on $id";
            
//echo $id;
            
$players Player::getAllPlayers();
            require 
"./views/index.view.php";
        }
        else {
            
$message "Tietoja puuttuu";
            require 
"./views/addplayerform.view.php";
        }
    }
    
    public static function 
posteditplayer()
    {
        if(isset(
$_POST["id"],$_POST["aname"],$_POST["email"],$_POST["character"],$_POST["money"])) {
            
$id $_POST["id"];
            
$account_name sanit($_POST["aname"]);
            
$email sanit($_POST["email"]);
            
$current_character sanit($_POST["character"]);
            
$money $_POST["money"];
                
            if(isset(
$_POST["banned"])) $banned 1;
            else 
$banned 0;

            
$data = array($account_name,$email,$money,$current_character,$banned,$id);

            if(
Player::editPlayer($data)) {
                    
$players Player::getAllPlayers();
                    
$message "Tiedot muutettu";
                    require 
"./views/admin.view.php";
            }
            else {
                
$players Player::getAllPlayers();
                
$message ="Muutos ei onnistunut";
                require 
"./views/admin.view.php";
            }

        }
        else {
            
$players Player::getAllPlayers();
            echo 
"Tietoja puuttuu";
            require 
"./views/index.view.php";
        }
    }
    
    public static function 
postlogin()
    {
        if(isset(
$_POST["password"],$_POST["account_name"])) {
            
$account_name sanit($_POST["account_name"]);
            
$password sanit($_POST["password"]);

            
$ok Player::loginPlayer($account_name,$password);
            if(
$ok) {
                
$player Player::getPlayerByName($account_name);
                
$id $player[0]->id;
                
$ip $_SERVER["REMOTE_ADDR"];

                
$_SESSION["id"] = $id;
                
$_SESSION["ip"] = $ip;

                
$players Player::getAllPlayers();
                require 
"./views/admin.view.php";
                
            } else {
                
$message ="Käyttäjän salasana ja käyttäjätunnus eivät vastaa toisiaan";
                require 
"./views/loginform.view.php";
            }
        }
        else 
        {
            
$message ="Et lähettänyt tietoja!!";
            require 
"./views/loginform.view.php";
        }
    }
}