Tworzenie gry przeglądarkowej – #3 Obsługa bazy danych
 Kontynuujemy tworzenie gry przeglądarkowej.

W tej części napiszemy klasę obsługującą bazę danych. W tym projekcie skorzystamy z bazy danych mySQL i narzędzia phpMyAdmin do administracji tej bazy. Zarówno mySQL jak i phpMyAdmin są zainstalowane razem z Wampem więc wszystko jest gotowe.

Zaczniemy od stworzenia bazy danych. Upewnij się że twój WampServer jest włączony i przejdź pod adres localhost/phpmyadmin. Wyświetli się interface phpmyadmin.

Stwórzmy nową bazę danych. Kliknij w przycisk Bazy danych w górnym menu. Przycisk wygląda tak:

bazydanych

Wpisujemy nazwę naszej bazy danych (w moim przypadku będzie to po prostu gra) i ustawiamy kodowanie. Moje ustawienia:tworzenie bazy danych mysql

Po kliknięciu przycisku Utwórz zostanie stworzona nowa baza danych. Utwórzmy teraz nowego użytkownika z prawami do obsługi tej bazy danych. Wybierz przycisk Użytkownicy z górnego menu. Wygląda on tak:

uzytkownicy mysql

Wyświetli się lista użytkowników. Pod nią znajduje się napis Dodaj użytkownika. Kliknij w ten link.

dodaj uzytkownika mysql

ustawieniaus

Możesz kliknąć na obrazek aby go powiększyć. Dodając nowego użytkownika, musimy podać jego nazwę. Następnie wybieramy z listy Host lokalny i wpisujemy hasło. Zaznaczamy następnie opcję Zaznacz wszystkie by nadać użytkownikowi wszystkie prawa. Klikamy Wykonaj.

Przejdźmy teraz do pliku config.php i ustawmy wcześniej stworzone stałe na odpowiednie dane:

// STAŁE DLA BAZY DANYCH
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PW', 'haslo');
define('DB_DB', 'gra');

W pierwszej linijce podajemy adres serwera. Korzystamy z serwera lokalnego więc będzie to po prostu localhost. W drugiej linijce podajemy nazwę stworzonego użytkownika. W trzeciej jego hasło. W ostatniej linijce podajemy nazwę bazy.

Baza danych jest już gotowa. Dodajmy teraz tabelę, w której będą przechowywane dane użytkowników. Użyjemy jej w jednej z kolejnych lekcji przy tworzeniu rejestracji, a w tej posłuży nam do testów klasy obsługującej zapytania bazodanowe. Wybierzmy z menu bocznego nazwę naszej bazy:

wybierz baze

Następnie wpiszmy nazwę tabeli i ilość kolumn:

utworz tabele

Otworzy nam się okno, w którym nazwiemy kolumny i nadamy im odpowiedni typ i atrybuty:

tabela ustawienia mysql

Możesz kliknąć na obrazek aby go powiększyć. Na początku nadajemy pierwszej kolumnie nazwę id oraz typ INT. Będzie to unikalny identyfikator każdego użytkownika. W tym wierszu zaznaczamy jeszcze indeks PRIMARY i opcję A_I – auto increment. Oznacza to wraz z rejestracją kolejnych użytkowników wartość id będzie rosła.

Kolejną kolumnę nazywamy username nadajemy jej typ VARCHAR i ustawiamy długość na 20 znaków. Będzie to kolumna przechowująca nazwę użytkownika.

Trzecia kolumna różni się od poprzedniej tylko nazwą i będzie przechowywała hasło użytkownika.

Ostatnia kolumna przechowywać będzie email użytkownika. Klikamy Zapisz. Tabela została utworzona. Przejdźmy teraz do napisania klasy, która obsłuży zapytania do bazy.

W folderze Managers utwórzmy plik DatabaseManager.class.php. Możemy teraz napisać początkową strukturę pliku.

<?php

class DatabaseManager {
     
       
   
}

?>

Na początku napiszemy metodę, która przeprowadzi połączenie z bazą, ponieważ będziemy jej potrzebować w kolejnych.

Metoda getConnection:

static public function getConnection() {
        
        $conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PW, DB_DB); //połączenie, podajemy stałe zdefiniowane w config.php
        
        if(mysqli_connect_errno()) { //wystąpił błąd w połączeniu
        
            return false;
        
        } else { //połączenie udane
            
            return $conn; //zwracamy połączenie
            
        }
        
}

Pomiędzy znakami { } klasy DatabaseManager dodaj powyższy kod.

Do zmiennej $conn przypisujemy nowe połączenie z parametrami, które ustawiliśmy w pliku config.php. Poniżej sprawdzamy czy wystąpił błąd w połączeniu. Jeśli tak to zwracamy false jeśli nie to zwracamy zmienną przetrzymującą połączenie. Ta i kolejne metody, które przedstawię za chwilę zawierają komentarze, które mówią co dzieje się w danym momencie. Napiszmy teraz metodę która zrealizuje zapytanie SELECT czyli takie, które wybiera dane z bazy.

Metoda selectBySQL:

static public function selectBySQL($SQL) { //zapytanie sql w parametrze
        
        $conn = self::getConnection(); //łączymy z bazą danych
        $SQL = $conn->real_escape_string($SQL); //zabezpieczenie
        $result = $conn->query($SQL); //wykonujemy zapytanie
        
                
        if(!$result) { //zapytanie nie powiodło się
          
            return false; //zwracamy false
            
        } else {
            
            $resultArray = Array(); //tworzymy tablicę
                
                while(($row = $result->fetch_array(MYSQLI_ASSOC)) !== NULL) { //dodajemy wyniki zapytania do tablicy
                
                    $resultArray[] = $row;
                }
            
        }
        
        if(count($resultArray) > 0) { 
                return $resultArray; //Jeśli tablica zawiera wyniki, czyli odnaleziono dane w bazie danych to zwracamy tą tablicę z wynikami
            } else {
                return false; //Zwracamy false
            }
        
        mysqli_close($conn); //zamknięcie połączenia
        
}

Poniżej poprzedniej metody dodaj powyższy kod.

Nie chcę żeby ten wpis był bardzo długi więc dodałem komentarze, które tłumaczą całą metodę. Przejdźmy do zastosowania. Zanim użyjemy funkcji selectBySQL musimy mieć jakieś dane do wybrania. Przejdźmy do phpmyadmin i wybierzmy z menu po lewej stronie tabelę users. Z górnego menu wybieramy teraz przycisk Wstaw. Dodajemy użytkownika:

dodaj uzytkownika mysql

 

Klikamy Wykonaj i użytkownik zostaje zapisany do tabeli. Teraz przechodzimy do pliku home.library.php i wykonujemy zapytanie do bazy danych.

<?php

ModuleLoader::load('home');

$select = DatabaseManager::selectBySQL("SELECT * FROM users WHERE id=1");

echo "<pre>";
print_r($select);
echo "</pre>";

?>

Do zmiennej $select przypisujemy wynik użycia metody selectBySQL z parametrem zaznaczającym wszystko, gdzie id jest równe 1.

Następnie wyświetlamy tą zmienną. Przechodzimy pod adres localhost/gra/home.

wynik_select

Oto wynik zapytania, więc wszystko działa jak należy. Przejdźmy teraz do napisanie kolejnej metody, tym razem UPDATE czyli takiej, która aktualizuje istniejące już dane w tabeli.

 

Metoda updateTable:

static public function updateTable($TABLE, $SET, $WHERE = Array(), $OPER = "AND") { // wzór zapytania: "UPDATE tabela SET kolumna='wartosc' WHERE kolumna='wartosc'"
        
        $conn = self::getConnection(); //łączymy z bazą danych
        
        $SQL = "UPDATE {$TABLE} SET "; //początek zapytania
        
        foreach($SET as $key => $val) { //pętla przechodząca przed tablicę $SET
            $SQL .= $key."='".$val."',"; //dodawanie do zapytania wartości do ustawienia
        }
        
        $SQL = rtrim($SQL, ','); //obcięcie ostatniego przecinka z zapytania
        
        if(count($WHERE) > 0) { //sprawdzenie czy tablica $WHERE ma zawartość
            
            $SQL .= " WHERE "; //jeśli ma dodajemy do zapytania WHERE
            
            foreach($WHERE as $key => $val) { //analogicznie jak przy $SET
                $SQL .= $key."='".$val."' ".$OPER." "; //uzupełniamy zapytanie o warunki oddzielone operatorem (domyślnie AND)
            }
            
            $SQL = substr($SQL, 0, strlen($SQL)-(strlen($OPER)+2)); //obcięcie końcowego operatora
            
        }
        
        $result = $conn->query($SQL); //wystosowanie zapytania
        
        if($result) { 
                return true; //powodzenie, zwracamy true
            } else {
                return false; //niepowodzenie, zwracamy false
            }
        
        mysqli_close($conn); //zamknięcie połączenia
        
}

Ponownie – bardzo dużo komentarzy, więc przejdziemy od razu do zastosowania.

<?php

ModuleLoader::load('home');

$select = DatabaseManager::selectBySQL("SELECT username FROM users WHERE id=1");

echo "<pre>";
print_r($select);
echo "</pre>";

DatabaseManager::updateTable("users", Array('username' => 'devcorner'), Array('id' => '1'));

echo "<hr>";

$select = DatabaseManager::selectBySQL("SELECT username FROM users WHERE id=1");

echo "<pre>";
print_r($select);
echo "</pre>";

?>

Usuwamy poprzednią zawartość home.library.php i wklejamy powyższą. Na początku za pomocą selectBySQL zaznaczamy username z tabeli users gdzie id jest równe 1. Następnie wyświetlamy wynik.

Teraz używając metody updateTable ustawiamy username na devcorner tam gdzie id jest równe 1. Poniżej powtarzamy zapytanie SELECT by zobaczyć czy tablica uległa zmianie. Oto wynik:

update tabeli wynik

Wszystko działa jak należy. Czas napisać metodę usuwającą dane z bazy. Przejdźmy do naszej klasy i poniżej metody updateTable dodajmy kolejną.

Metoda deleteFrom:

static public function deleteFrom($TABLE, $WHERE = Array(), $OPER = "AND") { // wzór zapytania "DELETE FROM tabela WHERE kolumna='wartosc'"
    
        $conn = self::getConnection(); //połączenie z bazą
        
        $SQL = "DELETE FROM {$TABLE}"; //początek zapytania
        
        if(count($WHERE) > 0) { //jeśli tabela $WHERE posiada zawartość
            
            $SQL .= " WHERE "; //dodajemy do zapytania WHERE
            
            foreach($WHERE as $key => $val) { //przechodzimy przez tablicę w pętli
                
                $SQL .= $key."='".$val."' ".$OPER." "; //dodajemy warunki do zapytania
                
            }
            
            $SQL = substr($SQL, 0, strlen($SQL) - (strlen($OPER)+2)); //usuwamy końcowy operator
            
        }
        
        $result = $conn->query($SQL); // wykonujemy zapytanie
        if(!($result)) {
            return false; //zapytanie nieudane, zwracamy false
        } else {
            return true; //zapytanie udane, zwracamy true
        }
        
        mysqli_close($conn); //zamknięcie połączenia
        
}

To cała metoda usuwająca dane z bazy. Zastosujemy ją w praktyce.

<?php

ModuleLoader::load('home');

$select = DatabaseManager::selectBySQL("SELECT username FROM users WHERE id=1");

echo "<pre>";
print_r($select);
echo "</pre>";

DatabaseManager::deleteFrom("users", array('id' => '1'));

echo "<hr>";

$select = DatabaseManager::selectBySQL("SELECT username FROM users WHERE id=1");

echo "<pre>";
print_r($select);
echo "</pre>";

?>

Tak wygląda zawartość home.library.php. Dwa zapytania SELECT i  DELETE pomiędzy nimi. Oto wynik:

delete mysql wynik

Pierwszy SELECT zwrócił tablicę, następnie ten rekord został usunięty – kolejny SELECT nie zwrócił nic. Działa. Możemy przejść do ostatniej już metody, która będzie dodawała rekordy do bazy danych. Poniżej metody deleteFrom dodajmy kolejną metodę.

Metoda insertInto:

static public function insertInto($TABLE, $DATA) { //wzór zapytania "INSERT INTO table_name (column1, ...) VALUES (value1, ...)"
    
        $conn = self::getConnection(); //połączenie z bazą
        
        $SQL = "INSERT INTO {$TABLE}"; //początek zapytania
        $SQL .= " (";
        
        foreach($DATA as $key => $val) {
            $SQL .= $key.","; //dodanie do zapytania wybranych kolumn
        }
        
        $SQL = rtrim($SQL, ","); //obcięcie przecinka z końca zapytania
        $SQL .= ") ";
        $SQL .= "VALUES";
        $SQL .= " (";
        
        foreach($DATA as $val) {
            $SQL .= "'".$val."',"; //dodanie do zapytania wybranych wartości
        }
        
        $SQL = rtrim($SQL, ','); //obcięcie przecinka z końca zapytania
        $SQL .= ")";
        
        $result = $conn->query($SQL); //wystasowanie zapytania
        if(!($result)) {
            return false; //niepowodzenie, zwracamy false
        } else {
            return true; //powodzenie, zwracamu true
        }
        
        mysqli_close($conn); //zamknięcie połączenie
        
}

Ta metoda również jest podobna do poprzednich. Napiszmy ostatni przykład 🙂

<?php

ModuleLoader::load('home');

$select = DatabaseManager::selectBySQL("SELECT * FROM users");

echo "<pre>";
print_r($select);
echo "</pre>";

DatabaseManager::insertInto("users", Array('username' => 'nazwa', 'password' => 'haslo', 'email' => 'przyklad@email.pl'));

echo "<hr>";

$select = DatabaseManager::selectBySQL("SELECT * FROM users");

echo "<pre>";
print_r($select);
echo "</pre>";

?>

Podobnie jak w poprzednich metodach umieszczamy metodę insertInto pomiędzy dwoma selectBySQL. W ten sposób od razu zobaczymy wynik zapytania. A oto on:

insert mysql wynik

Został dodany kolejny rekord do tabeli users. Klasa DatabaseManager jest gotowa do użycia. Wrócimy jeszcze do niej w jednej z kolejnej lekcji, w której omówimy bezpieczeństwo.

A już w kolejnym wpisie wprowadzimy do naszej gry szablon.

Dzięki 🙂

Paczkę możesz pobrać tutaj.

Spodobał Ci się artykuł? Dzięki naciśnięciu serduszka poniżej będę wiedział jakie treści tworzyć. Dzięki! :)

Tworzenie gry przeglądarkowej – #5 Rejestracja i logowanie Tworzenie wtyczek WordPress – #3 Wyświetlanie wydarzeń i ustawienia Tworzenie gry przeglądarkowej – #6 Statystyki gracza
View Comments
  • cześć, do tej pory wszystko szło jak po maśle, natomiast mam ten sam problem co Mateusz, nie pokazuje mi się ten przycisk na phpmyadmin. nie jestem tam jeszcze zarejestrowany, i nie wiem czy muszę to zrobić zanim, stworzę tą bazę danych? mógłbyś mi pomóc to ogarnąć? z góry dzięki 😉

  • @ Po raz pierwszy. Jak na razie fajnie wszystko szło, wpisałem w przeglądarke „localhost/phpmyadmin” i od razu wyskakuje mi logowanie się i wybór języka, nie mogę znaleźć tego cholernego przycisku…

  • Mam problem https://zapodaj.net/e9bb4b39850f4.png.html Nie mogę stworzyć bazy danych…

  • Świetny poradnik, świetny blog- na pewno będę zaglądać. Mam tylko nadzieję, że rozwiniesz ten projekt do takiego stopnia, że gra nie będzie jakoś znacznie odstawała od tych już istniejących. Chodzi o to, aby poznać jak najlepiej budowę gier.

    Masz zamiar założyć kanał na youtubie o podobnej/takiej samej tematyce jak blog?

    • Dzięki. Gra pewnie będzie odstawała trochę od tych istniejących, ponieważ chciałbym zamknąć ten poradnik w kilkunastu maksymalnie wpisach ale osoba, która dokładnie przerobi wszystkie wpisy będzie miała już umiejętności, które pozwolą jej samodzielnie dodać do gry co tylko zechce. Co do kanału na youtube to myślałem nad tym, ale pewnie nie w najbliższym czasie 🙂