Transformácia kódu do OOP

Úvodné slová k objektovo orientovanému programovaniu máme za sebou. Povedali sme si, čo to je a ako to vyzerá a taktiež sme si názorne ukázali na triede pre databázu, ako sa triedy objektov vytvárajú a ako sa použijú v praxi. Trieda pre databázu je pre nás plne funkčná a dostatočná a obsahuje základ toho, čo OOP predsatvuje. Všetko čo súvisí s pripojením do databázy sa viaže na daný objekt a kód vyzerá približne tak, ako by mal kód OOP vyzerať.

 

Transformácia kódu pre pripojenie do databázy na OOP nezabrala veľa času a námahy a ani neobsahuje veľa riadkov. Taktiež to bolo také skôr jednorázové použitie, pretože teoreticky nám na celý program (informačný systém) stačí jeden objekt tejto triedy. Triedy objektov sa ale vo väčšine vytvárajú na mnohonásobné použitie objektov, resp. v kóde sa nachádza množstvo inštancií tried. Aby sme sa teda tomu povenovali troška viac a ešte si to vyskúšali, prerobíme si ešte nejakú časť kódu zo súboru index.php na OOP tým, že si zadefinujeme triedu, ktorej objekt (inštancia) bude predstavovať – reprezentovať jedného používateľa v našej databáze. Ak si trúfate, skúste si to sami, vytvorte si triedu s názvom User, skúste dať properties, ktoré vám bude treba a aj metódy, ktoré budú súvisieť s týmto objektom. Výsledok by mal byť taký, aby čo najviac kódu, ktorý súvisí s používateľom, sa nejako týkal objektu tejto triedy.

 

Pochopiteľne, nemusíte to hneď zvládnuť sami, ideme si to teraz postupne spolu prejsť. Ako vieme, prioritne na našej domovskej stránke zobrazujeme zoznam používateľov tabuľkovou formou v spodnej časti stránky. Okrem toho je možné pomocou tejto stránky používateľov pridávať, meniť, mazať a vyhľadávať. Začneme teda tým, že na výpis používateľov využijeme nami vytvorenú triedu pre jedného používateľa. Ako to teda bude vyzerať?

 

Začneme vytvorením triedy pre definovanie jedného používateľa, ktorý sa zobrazuje v tabuľke na jedom riadku. V tabuľke prioritne iba zobrazujeme základné údaje z databázy, takže jednotlivé stĺpce by mohli predstavovať properties našej triedy. Metódy zatiaľ nepotrebujeme, budeme iba potrebovať konštruktor, podobne ako pri databáze. Mohlo by to vyzerať takto:

 


index.php (zadefinovanie triedy User za definovanie triedy Databaza):

//TRIEDA USER (pouzivatel v tabulke users)
class User{

    public $id = 0;
    public $user_name = '';
    public $user_surname = '';
    public $age = 0;
    public $role = '';

    function __construct($id, $user_name, $user_surname, $age, $role){
        $this->id = $id;
        $this->user_name = $user_name;
        $this->user_surname = $user_surname;
        $this->age = $age;
        $this->role = $role;
    }
}

 


Tento kód by pre nás nemal byť problém, možno ste sa ale zamysleli, načo nám bude alebo skôr, ako a kde ho zakomponovať. Čo robíme v kóde na začiatku časti pre zobrazenie tabuľky s používateľmi? Načítame si všetky dáta z databázy, ktoré si následne uložíme do premennej typu pole. Každý prvok tohto poľa je iba jednoduché pole, ktoré obsahuje dáta o používateľovi (tiež pole), ktoré si následne prechádzame a zobrazujeme do riadkov tabuľky. Podstata OOP je, aby sme nemali premenné, ktoré majú iba premenné a podobne alebo aby obsahovali iba nejaké hodnoty. Cieľ je pracovať s objektami, takže práve toto pole (výsledok SELECTu z DB) si celé prejdeme a pretransformujeme ho na pole objektov. Následne si podobne toto pole prejdeme a vypíšeme údaje do tabuľky, tentokrát ale budeme vypisovať už properties objektu User a nie iba hodnoty prvkov pola. Malo by to vyzerať takto:

 


index.php (úprava existujúceho kódu):


<?php
//VYPIS POUZIVATELOV DO TABULKY
if (mysqli_num_rows($result) > 0) {
    $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
    $users = [];

    //TRANSFORMACIA DAT NA POLE OBJEKTOV
    foreach($data as $key => $value){
        $users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
    }

    echo '<table class="persons">';
    …
        for($i=0; $i<count($users); $i++){
            echo '<tr>';
                foreach($users[$i] as $index => $value){
                    echo '<td>'.$value.'</td>';
                }

                echo '<td>';
                    echo '<a href="uprava-zaznamu.php?id_user='.$users[$i]->id.'">Upraviť záznam</a><br><br>';
                    echo '<a href="index.php?id_user='.$users[$i]->id.'" onclick="return showConfirm()">Vymazať záznam</a>';
                echo '</td>';

            echo '</tr>';
        }

    echo '</table>';

 


Ako vidíte v ukážke, za načítanie dát z databázy sme si zadeklarovali nové pole s názvom users. Následne si pole data, ktoré obsahuje dáta z databázy, prechádzame cyklom foreach a pre každý prvok poľa data vkladáme do poľa users nový objekt triedy User. Takto získame nie pole polí, ale pole objektov triedy User. Následne sme upravili kód pre výpis riadkov a buniek tabuľky tak, že namiesto poľa data prechádzame pole users a taktiež sme museli zmeniť výpis url pri odkazoch na editáciu (z ['id'] na ->id). Ak si dáte vypísať pole users pomocou príkazu print_r, tak uvidíte, že každý prvok je objekt User (je to napísané namiesto array).

 

Keď sa pozrieme na kód tabuľky, tak vidíme, že s používateľom okrem výpisu v nej už nič nevykonávame, takže tu už viac zakomponovať tento objekt nemáme ako, takže by to malo byť v poriadku. Vráťme sa ale k tomu, ako sme si povedali, že zobrazujeme zoznam používateľov. Zoznam nám v tomto prípade reprezentuje premenná users a taktiež s ním vykonávame operáciu – načítanie dát z databázy. Vyššie od výpisu tabuľky máme niekoľko riadkov kódu, ktoré vykonávajú načítanie dát z databázy (skladanie query pre SELECT). Tento kód obsahuje viacero premenných (pre filtrovanie, pre zoraďovanie), ktoré sa vytvárajú na danom mieste a s načítaním zoznamu súvisia. Čo keby sme si vytvorili triedu pre zoznam používateľov, ktorý by sa skladal z objektov triedy User? A samotné načítanie dát by bola jeho metóda? Troška by nám to upratalo kód a stal by sa čitatelnejším, poďme teda na to. Potrebujeme teda triedu napríklad s názvom UserList (zoznam používateľov), ktorá by mala v sebe obsahovať všetko, čo súvisí so zoznamom a načítanám dát z DB. Mohlo by to vyzerať asi takto:

 


index.php (pridanie novej triedy):

//TRIEDA USERLIST (zoznam pouzivatelov)
class UserList{

    public $users = array();
    public $search_keyword = '';
    public $sort_by = 'id';
    public $sort_type = 'ASC';

    function loadData($db_connection){
        $sql_query = "SELECT * FROM users";

        if($this->search_keyword){
            $sql_query .= " WHERE user_name LIKE '%".$this->search_keyword."%' OR user_surname LIKE '%".$this->search_keyword."%'";
        }

        if($this->sort_by){
            $sql_query .= " ORDER BY ".$this->sort_by;

            if($this->sort_type){
                $sql_query .= " ".$this->sort_type;
            }else{
                $sql_query .= " ASC";
            }
        }

        $result = mysqli_query($db_connection, $sql_query);

        if (mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_all($result, MYSQLI_ASSOC);

            //TRANSFORMACIA DAT NA POLE OBJEKTOV
            foreach($data as $key => $value){
                $this->users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
            }
        }

    }
}

 


Ako vidíte na ukážke kódu, do tejto triedy sme si vložili samotný zoznam používateľov (users), ako aj parametre, ktoré súvisia s vyťahovaním dát z databázy (zoraďovanie a filtrovanie). Celé načítanie z databázy a pretransformovanie zoznamu na zoznam objektov User sa vykonáva v metóde loadData. Aby sme mohli vykonať query na databázu, museli sme si pripojenie do DB (ktoré sa v kóde vytvára na začiatku) preposlať ako parameter do tejto metódy. Vytvorenie tohto objektu a zavolanie funkcie loadData nám zabezpečí, že sa v property users tohto objektu bude nachádzať zoznam našich používateľov (objekty triedy User).

 

Po tomto kroku musíme prepísať všetky výskyty premenných sort_by, sort_type a search_keyword na $user_list->sort_by a podobne. Za pripojením do databázy by sme mali vytvoriť objekt zoznamu a následne načítať parametre (filtrovanie, zoraďovanie), aby sa uložili do tohto objektu a na záver potom zavolať funkciu loadData. Tieto kroky by mali viesť ku korektnému načítaniu používateľov z DB, ktorí sa budú nachádzať v objekte UserList v property users, kde každý prvok bude objekt triedy User. Kód použitia týchto objektov by mal vyzerať teda takto:

 


index.php (časti s objektami tried UserList a User):

//PRIPOJENIE DO DB
$db = new Database('localhost', 'root', 'root', 'zapr_db_1');
$db->connectToDb();

(starý kód pre vymazanie a vlozenie noveho usera)

<?php

    $user_list = new UserList();

    //SPRACOVANIE FILTROVANIA
    if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['search_form']){
        $user_list->search_keyword = $_GET['search_keyword'];
    }

    //ZACHYTENIE PARAMETRA PRE TRIEDENIE DAT V TABULKE
    $user_list->sort_by = $_GET['sort_by'];
    $user_list->sort_type = $_GET['sort_type'];

    $user_list->loadData($db->connection);

    echo '<h2>Zoznam používateľov</h2>';

?>

<!-- Formular na filtrovanie usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get">
    <label for="search_keyword">Meno</label>
    <input type="text" name="search_keyword" id="search_keyword" value="<?php echo $user_list->search_keyword;?>">

    <input type="hidden" name="sort_by" value="<?php echo $user_list->sort_by;?>">
    <input type="hidden" name="sort_type" value="<?php echo $user_list->sort_type;?>">

    <input type="submit" name="search_form" value="Filtruj">
</form>

<br>

<?php
    //VYPIS POUZIVATELOV DO TABULKY
    if($user_list->users){

        echo '<table class="persons">';
            echo '<tr>';
                echo '<th>ID</th>';

                echo '<th><a class="sortable';

                if($user_list->sort_by == 'user_name'){
                    if($user_list->sort_type == 'ASC'){
                        echo ' asc';
                    }else{
                        echo ' desc';
                    }
                }

                echo '" href="index.php?sort_by=user_name';

                if($user_list->sort_by == 'user_name'){
                    if($user_list->sort_type == 'ASC'){
                        echo '&sort_type=DESC';
                    }else{
                        echo '&sort_type=ASC';
                    }
                }else{
                    echo '&sort_type=ASC';
                }

                if($user_list->search_keyword){
                    echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
                }

                echo '">Meno</a></th>';

                echo '<th><a class="sortable';

                if($user_list->sort_by == 'user_surname'){
                    if($user_list->sort_type == 'ASC'){
                        echo ' asc';
                    }else{
                        echo ' desc';
                    }
                }

                echo '" href="index.php?sort_by=user_surname';

                if($user_list->sort_by == 'user_surname'){
                    if($user_list->sort_type == 'ASC'){
                        echo '&sort_type=DESC';
                    }else{
                        echo '&sort_type=ASC';
                    }
                }else{
                    echo '&sort_type=ASC';
                }

                if($user_list->search_keyword){
                    echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
                }

                echo '">Priezvisko</a></th>';

                echo '<th>Vek</th>';
                echo '<th>Rola</th>';
                echo '<th>Akcie</th>';
            echo '</tr>';

            for($i=0; $i<count($user_list->users); $i++){
                echo '<tr>';
                    foreach($user_list->users[$i] as $index => $value){
                        echo '<td>'.$value.'</td>';
                    }

                    echo '<td>';
                        echo '<a href="uprava-zaznamu.php?id_user='.$user_list->users[$i]->id.'">Upraviť záznam</a><br><br>';
                        echo '<a href="index.php?id_user='.$user_list->users[$i]->id.'" onclick="return showConfirm()">Vymazať záznam</a>';
                    echo '</td>';

                echo '</tr>';
            }

        echo '</table>';

    } else {
        echo "0 results were selected.";
    }

    echo '<br><br>';

    mysqli_close($db->connection);
?>

 


Pri tomto kroku bolo najmä dôležité nahradiť všetky výskyty premenných pre zoraďovanie a filtrovanie property triedy UserList (aj hidden elementy vo formulároch). Ako vidíte, stránka sa správa skutočne tak ako predtým, len kód vyzerá podstatne inak. Teraz sa už náš kód skladá z deklarácie troch tried, za ktorými nasledujú dva riadky, ktoré sa pripoja do databázy (pomocou objektu pre pripojenie do db). Následne máme starý kód pre mazanie a vkladanie nového používateľa, za ktorým nasleduje kód pre načítanie zoznamu používateľov (objekt UserList, načítanie parametrov a načítanie dát). Na konci je už len formulár pre filtrovanie a samotná tabuľka.

 

Ako vidíte, pomocou týchto tried sme prepísali kód, ktorý sa týkal zoznamu používateľov v tabuľke. V týchto sekciách nemáme žiadne premenné v kóde a ani funkcie, ktoré nám nič nevravia, resp. nesúvisia (nie sú jeho časťou) so žiadnym objektom nejakej triedy. V nasledujúcej prednáške našu premenu kódu súboru index.php na OOP dokončíme.

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Obsah súborov projektu po tejto prednáške

1 - footer.php

<div class="footer">
</div>

2 - fotogaleria.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "fotogaleria";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div id="gallery-content" class="main-content right">
<h1>Fotogaléria</h1>
<div class="line"></div>

<?php

$pictures = array();

for($i = 0; $i < 30; $i++){
$pictures[] = 'images/placeholder.jpg';
}

//zadefinovanie maximalneho poctu pre jednu stranku a nacitanie parametra (urcenie aktualnej stranky)
$countPerPage = 12;
if($_GET['page']){
$page = $_GET['page'];
}else{
$page = 1;
}

//vypocet od ktorej po ktoru fotku zobrazujeme galeriu
$start = ($page-1)*$countPerPage;
$end = $page*$countPerPage;

echo '<ul id="gallery">';
for($i = $start; $i < $end; $i++){

if($pictures[$i]){
echo '<li class="left';

if(($i+1)%3){
echo ' photo-margin';
}

echo '">';

echo '<img src="'.$pictures[$i].'">';

echo '<a target="_blank" href="'.$pictures[$i].'" class="over_div">';
echo '<span>Kliknite pre zväčšenie!</span>';
echo '</a>';

echo '</li>';
}
}
echo '</ul>';

//cyklus, ktory nam vypise dostatocny pocet odkazov pre jednotlive stranky
$pageLink = 1;
$photosCount = count($pictures);

echo '<ul class="pagination">';
while($photosCount > 0){

echo '<li><a ';

if($pageLink == $page){
echo ' class="active" ';
}

echo 'href="fotogaleria.php?page='.$pageLink.'">'.$pageLink.'</a>';
echo '</li>';
$photosCount = $photosCount - $countPerPage;
$pageLink++;
}
echo '</ul>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

3 - global.css

BODY{
margin: 0;
background-color: #dee8e7;
font-family: Arial;
}

H1{
color: #5b6b78;
margin-bottom: 10px;
}

.line{
height: 3px;
border-top: 1px dotted #5b6b78;
border-bottom: 1px dotted #5b6b78;
margin-bottom: 25px;
}

.main{
background-color: #f6f7f1;
width: 900px;
margin: auto;
margin-top: 20px;
margin-bottom: 20px;
}

.header{
border-bottom: 1px solid #7d8079;
height: 150px;
}

.header-inner1{
}

.header-inner2{
}

.content{
}

.footer{
border-top: 1px solid #7d8079;
height: 200px;
}

.half-width{
width: 50%;
}

.full-height{
height: 100%;
}

.left{
float: left;
}

.right{
float: right;
}

.clear{
clear: both;
}

/**********MENU***********/
.sidebar{
width: 200px;
height: 400px;
}

.sidebar UL{
list-style-type: none;
padding: 0;
margin: 0;
}

.sidebar UL LI{
position: relative;
}

.sidebar UL LI A, .sidebar UL LI:HOVER .submenu A{
display: block;
padding: 15px 0px 15px 35px;
border-bottom: 1px solid #7d8079;
color: #7d8079;
text-decoration: none;
text-transform: uppercase;
}

.sidebar UL LI A.active{
color: #f5f7f4;
background-color: #f96b81;
}

.sidebar UL LI:HOVER A, .sidebar UL LI .submenu LI:HOVER A{
background-color: #5b6b78;
color: #d6e3e9;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

.submenu{
display: none;
border: 2px solid #7d8079;
position: absolute;
top: -1px;
left: 201px;
width: 200px;
background-color: #FFFFFF;
}

.sidebar UL LI:HOVER .submenu{
display: block;
}

.sidebar UL LI:HOVER .submenu A{
background-color: #FFFFFF;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

/**********GALERIA***********/
/**********GALERIA***********/
#gallery{
display: inline-block;
width: 100%;
list-style-type: none;
margin: 0;
padding: 0;
}

#gallery LI{
position: relative;
height: 133px;
margin-bottom: 10px;
}

#gallery LI IMG{
width: 213px;
height: 133px;
}

.photo-margin{
margin-right: 10px;
}

#gallery A{
display: none;
}

#gallery LI:HOVER A{
display: block;
}

#gallery LI:HOVER{
outline: 2px solid #7d8079;
}

#gallery A{
text-decoration: none;
position: absolute;
background-color: grey;
opacity: 0.4;
height: 100%;
width: 100%;
top: 0px;
}

#gallery A SPAN{
position: relative;
top: 100px;
color: #FFFFFF;
font-weight: bold;
}

/**********PERSONS***********/
.persons{
width: 100%;
font-family: Arial;
}

.persons, .persons TH, .persons TD{
border: 1px solid #D9E4E6;
}

.persons TH, .persons TD{
padding: 10px;
}

.persons TH{
background-color: #167F92;
color: #FFFFFF;
font-weight: normal;
text-transform: uppercase;
}

.persons TR:nth-child(odd){
background-color: #D9E4E6;
}

.persons TR{
color: #024457;
background-color: #FFFFFF;
}

.persons TD{
font-size: 14px;
}

.persons TR:HOVER{
color: #f5f7f4;
background-color: #f96b81;
cursor: pointer;
}

.persons TH A.sortable{
color: #FFFFFF;
}

.persons TH A.sortable:HOVER{
color: #D9E4E6;
}

.persons TH A.sortable.asc:before{
content: '⇡ ';
}

.persons TH A.sortable.desc:before{
content: '⇣ ';
}

/**********PERSONS***********/
.contact_form{
padding: 20px;
border: 1px solid #ebebeb;
background-color: white;
font-family: Arial;
font-size: 14px;
color: #455560;
text-transform: uppercase;
text-align: center;
}

.contact_form INPUT, .contact_form TEXTAREA, .contact_form LABEL{
display: block;
width: 100%;
}

.contact_form LABEL{
margin-bottom: 5px;
text-align: left;
}

.contact_form INPUT, .contact_form TEXTAREA{
height: 30px;
border: 1px solid #bababa;
margin-bottom: 30px;
}

.contact_form TEXTAREA{
min-height: 100px;
min-width: 100%;
max-width: 100%;
}

.contact_form INPUT[type="submit"]{
display: inline;
width: 200px;
height: 40px;
background-color: #7bc143;
border: 1px solid #6fae3c;
font-size: 16px;
color: #FFFFFF;
text-transform: uppercase;
}

.contact_form INPUT[type="submit"]:HOVER{
cursor: pointer;
background-color: #42aa44;
}

.success, .error{
border: 1px solid;
margin: 10px 0px;
padding:15px 10px 15px 10px;
}

.success {
color: #4F8A10;
background-color: #DFF2BF;
}

.error {
color: #D8000C;
background-color: #FFBABA;
}
/**********PAGINATION***********/
#gallery-content{
text-align: center;
}

ul.pagination {
display: inline-block;
padding: 0;
margin: 10px 0px 20px 0px;
}

ul.pagination li {
display: inline;
}

ul.pagination li a {
color: black;
padding: 8px 16px;
text-decoration: none;
border: 1px solid #ddd;
}

ul.pagination li a.active {
background-color: #4CAF50;
color: white;
}

ul.pagination li a:hover{
background-color: #ddd;
}

.map{
margin: 30px 0px;
text-align: center;
padding: 25px 0px;
background-color: #FFFFFF;
}

4 - header.php

<div class="header">
<div class="header-inner1 full-height half-width left"></div>
<div class="header-inner2 full-height half-width left"></div>
</div>

5 - index.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "index";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Domov</h1>
<div class="line"></div>

<h2>Pridanie nového používateľa</h2>

<?php

//TRIEDA DATABAZA (pripojenie)
class Database{

public $server_name = '';
public $login_name = '';
public $login_password = '';
public $db_name = '';
public $connection = null;

function __construct($server_name, $login_name, $login_password, $db_name){
$this->server_name = $server_name;
$this->login_name = $login_name;
$this->login_password = $login_password;
$this->db_name = $db_name;
}

function connectToDb(){
$this->connection = mysqli_connect($this->server_name, $this->login_name, $this->login_password, $this->db_name);

if (!$this->connection) {
echo 'Spojenie s databázou sa nepodarilo nadviazať.';
}else{
// echo 'Spojenie s databázou sa podarilo úspešne nadviazať.';
}
}
}

//TRIEDA USER (pouzivatel v tabulke users)
class User{

public $id = 0;
public $user_name = '';
public $user_surname = '';
public $age = 0;
public $role = '';

function __construct($id, $user_name, $user_surname, $age, $role){
$this->id = $id;
$this->user_name = $user_name;
$this->user_surname = $user_surname;
$this->age = $age;
$this->role = $role;
}
}

//TRIEDA USERLIST (zoznam pouzivatelov)
class UserList{

public $users = array();
public $search_keyword = '';
public $sort_by = 'id';
public $sort_type = 'ASC';

function loadData($db_connection){
$sql_query = "SELECT * FROM users";

if($this->search_keyword){
$sql_query .= " WHERE user_name LIKE '%".$this->search_keyword."%' OR user_surname LIKE '%".$this->search_keyword."%'";
}

if($this->sort_by){
$sql_query .= " ORDER BY ".$this->sort_by;

if($this->sort_type){
$sql_query .= " ".$this->sort_type;
}else{
$sql_query .= " ASC";
}
}

$result = mysqli_query($db_connection, $sql_query);

if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);

//TRANSFORMACIA DAT NA POLE OBJEKTOV
foreach($data as $key => $value){
$this->users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
}
}

}
}

//PRIPOJENIE DO DB
$db = new Database('localhost', 'root', 'root', 'zapr_db_1');
$db->connectToDb();

//MAZANIE POLOZKY
$id_user = $_GET['id_user'];
if($id_user){
$sql_query = "DELETE FROM users WHERE id=".$id_user;
$result = mysqli_query($db->connection, $sql_query);

if($result){
echo '<p class="success">Položka bola úspešne zmazaná.</p>';
}else{
echo '<p class="error">Pri mazaní položky sa vyskytla chyba.</p>';
}
}

//ZACHYTENIE PARAMETROV

if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['user_form']){
$user_name = $_POST['user_name'];
$user_surname = $_POST['user_surname'];
$age = $_POST['age'];
$role = $_POST['role'];

if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){

//KOREKTNE DATA

//ulozenie do DB
$sql_query = "INSERT INTO users (user_name, user_surname, age, role) VALUES (";
//otestovanie ci prisli parametre, inak vkladame NULL
if($user_name){
$sql_query .= "'".$user_name."',";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "'".$user_surname."',";

if($age){
$sql_query .= $age.",";
}else{
$sql_query .= "NULL,";
}

if($role){
$sql_query .= "'".$role."')";
}else{
$sql_query .= "NULL)";
}

$result = mysqli_query($db->connection, $sql_query);

if($result){
echo '<p class="success">Položka bola úspešne uložená.</p>';
}else{
echo '<p class="error">Pri ukladaní dát do databzy sa vyskytla chyba.</p>';
}

//vycistenie poloziek
$user_name = '';
$user_surname = '';
$age = '';
$role = '';

}else{
//CHYBNE DATA

echo '<p class="error">Nová položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}

}
?>

<!-- Formular pre vlozenie noveho usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">

<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">

<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">

<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">

<input type="submit" name="user_form" value="Odoslať">
</form>

<?php

$user_list = new UserList();

//SPRACOVANIE FILTROVANIA
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['search_form']){
$user_list->search_keyword = $_GET['search_keyword'];
}

//ZACHYTENIE PARAMETRA PRE TRIEDENIE DAT V TABULKE
$user_list->sort_by = $_GET['sort_by'];
$user_list->sort_type = $_GET['sort_type'];

$user_list->loadData($db->connection);

echo '<h2>Zoznam používateľov</h2>';

?>

<!-- Formular na filtrovanie usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get">
<label for="search_keyword">Meno</label>
<input type="text" name="search_keyword" id="search_keyword" value="<?php echo $user_list->search_keyword;?>">

<input type="hidden" name="sort_by" value="<?php echo $user_list->sort_by;?>">
<input type="hidden" name="sort_type" value="<?php echo $user_list->sort_type;?>">

<input type="submit" name="search_form" value="Filtruj">
</form>

<br>


<?php
//VYPIS POUZIVATELOV DO TABULKY
if($user_list->users){

echo '<table class="persons">';
echo '<tr>';
echo '<th>ID</th>';

echo '<th><a class="sortable';

if($user_list->sort_by == 'user_name'){
if($user_list->sort_type == 'ASC'){
echo ' asc';
}else{
echo ' desc';
}
}

echo '" href="index.php?sort_by=user_name';

if($user_list->sort_by == 'user_name'){
if($user_list->sort_type == 'ASC'){
echo '&sort_type=DESC';
}else{
echo '&sort_type=ASC';
}
}else{
echo '&sort_type=ASC';
}

if($user_list->search_keyword){
echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
}

echo '">Meno</a></th>';

echo '<th><a class="sortable';

if($user_list->sort_by == 'user_surname'){
if($user_list->sort_type == 'ASC'){
echo ' asc';
}else{
echo ' desc';
}
}

echo '" href="index.php?sort_by=user_surname';

if($user_list->sort_by == 'user_surname'){
if($user_list->sort_type == 'ASC'){
echo '&sort_type=DESC';
}else{
echo '&sort_type=ASC';
}
}else{
echo '&sort_type=ASC';
}

if($user_list->search_keyword){
echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
}

echo '">Priezvisko</a></th>';

echo '<th>Vek</th>';
echo '<th>Rola</th>';
echo '<th>Akcie</th>';
echo '</tr>';

for($i=0; $i<count($user_list->users); $i++){
echo '<tr>';
foreach($user_list->users[$i] as $index => $value){
echo '<td>'.$value.'</td>';
}

echo '<td>';
echo '<a href="uprava-zaznamu.php?id_user='.$user_list->users[$i]->id.'">Upraviť záznam</a><br><br>';
echo '<a href="index.php?id_user='.$user_list->users[$i]->id.'" onclick="return showConfirm()">Vymazať záznam</a>';
echo '</td>';

echo '</tr>';
}

echo '</table>';

} else {
echo "0 results were selected.";
}

echo '<br><br>';

mysqli_close($db->connection);
?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>

<script>
function showConfirm(){
var answer = confirm("Naozaj chcete vymazať daný záznam?");

if(answer){
//vykonanie, ak pouzivatel potvrdi confirm okno - odkaz sa vykona
return true;
}else{
//vykonanie, ak pouzivatel zruzi confirm okno - odkaz sa nevykona
return false;
}
}
</script>

</body>
</html>

6 - kontakt.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "kontakt";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Kontakt</h1>
<div class="line"></div>

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['contact_form']){
if(!preg_match('#^[a-zA-Z0-9]{5,10}$#', $_POST['name']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
echo '<p class="error">Zadajte prosim korektne udaje</p>';

//naplnenie formulara
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
}else{
//odoslanie emailu
echo '<p class="success">Vasa sprava bola uspesne odoslana.</p>';

$name = '';
$email = '';
$subject = '';
$message = '';
}

}

?>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" class="contact_form">
<label for="email">Meno a priezvisko</label>
<input type="text" name="name" id="name" value="<?php echo $name;?>"><br><br>

<label for="email">Email</label>
<input type="text" name="email" id="email" value="<?php echo $email;?>"><br><br>

<label for="subject">Predmet</label>
<input type="text" name="subject" id="subject" value="<?php echo $subject;?>"><br><br>

<label for="message">Správa</label>
<textarea name="message" id="message" placeholder="Zadajte text spravy..."><?php echo $message;?></textarea><br><br>

<input type="submit" name="contact_form" value="Odoslat">
</form>

<div class="map">
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d84199.38373426767!2d19.06093170408453!3d48.73928892777478!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47153de36e8ad42f%3A0xf8223f8a0b8b9032!2sBansk%C3%A1+Bystrica!5e0!3m2!1ssk!2ssk!4v1465151393672" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

7 - menu.php

<div class="sidebar left">
<ul>
<li><a class="<?php if($actual_page == "index"){echo 'active';}?>" href="index.php">Domov</a></li>
<li><a class="<?php if($actual_page == "o-nas"){echo 'active';}?>" href="o-nas.php">O nás</a></li>
<li><a class="<?php if($actual_page == "fotogaleria"){echo 'active';}?>" href="fotogaleria.php">Fotogaléria</a></li>
<li>
<a class="<?php if($actual_page == "kontakt"){echo 'active';}?>" href="kontakt.php">Kontakt</a>

<ul class="submenu">
<li><a href="kontakt.php">Kontakt</a></li>
<li><a href="kontakt.php">Kontakt</a></li>
</ul>

</li>
</ul>
</div>

8 - o-nas.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "o-nas";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>O nás</h1>
<div class="line"></div>

<?php
$person_1 = array('Raťafák', 'Plachta', 'plachtos@mail.sk','0903 123 123');
$person_2 = array('Od kuka', 'do kuka', 'kuko@mail.sk','0903 123 123');
$person_3 = array('Joey', 'Tribbiani', 'ako.sa.mas@mail.sk','0903 123 123');
$person_4 = array('Charlie', 'Harper', 'hooker@mail.sk','0903 123 123');
$person_5 = array('Chruno', 'Moysey', 'abstinent@mail.sk','0903 123 123');

$pole = array($person_1, $person_2, $person_3, $person_4, $person_5);

$pole[5] = array('Jardo', 'Jágr', 'legenda@mail.sk','0903 123 123');

echo '<table class="persons">';
echo '<tr>';
echo '<th>Meno</th>';
echo '<th>Priezvisko</th>';
echo '<th>Email</th>';
echo '<th>Telefónne číslo</th>';
echo '</tr>';

for($i=0; $i<count($pole); $i++){
echo '<tr>';

for($j=0; $j<count($pole[$i]); $j++){
echo '<td>'.$pole[$i][$j].'</td>';
}

echo '</tr>';
}

echo '</table>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

9 - uprava-zaznamu.php

<!DOCTYPE html>

<html lang="sk">
<head>
<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Editácia používateľa</h1>
<div class="line"></div>

<?php
$id_user = $_GET['id_user'];

//PRIPOJENIE DO DB
$server_name = "localhost";
$db_user_name = "root";
$password = "root";
$dbname = "zapr_db_1";

$connection = mysqli_connect($server_name, $db_user_name, $password, $dbname);

if (!$connection) {
echo '<p class="error">Spojenie s databázou sa nepodarilo nadviazať.</p>';
}

//SPRACOVANIE ODOSLANIA FORMULARA
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['edit_user_form']){
$user_name = $_GET['user_name'];
$user_surname = $_GET['user_surname'];
$age = $_GET['age'];
$role = $_GET['role'];

if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){

//KOREKTNE DATA

//ulozenie do DB
$sql_query = "UPDATE users SET user_name=";

//otestovanie ci prisli parametre, inak vkladame NULL
if($user_name){
$sql_query .= "'".$user_name."',";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "user_surname='".$user_surname."',age=";

if($age){
$sql_query .= $age.",";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "role=";

if($role){
$sql_query .= "'".$role."'";
}else{
$sql_query .= "NULL";
}

$sql_query .= " WHERE id=".$id_user.";";

$result = mysqli_query($connection, $sql_query);

if($result){
echo '<p class="success">Položka bola úspešne uložená.</p>';
?>

<script>
window.location.href = "/MyProject Coding/5-Projekt2/index.php";
</script>

<?php
}else{
echo '<p class="error">Pri ukladaní dát do databázy sa vyskytla chyba.</p>';
}


}else{
//CHYBNE DATA
echo '<p class="error">Položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}
}

//NACITANIE DAT O USEROVI
if($id_user){
$sql_query = "SELECT * FROM users WHERE id=".$id_user.";";

$result = mysqli_query($connection, $sql_query);

if (mysqli_num_rows($result) > 0) {

$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
$user_name = $data[0]['user_name'];
$user_surname = $data[0]['user_surname'];
$age = $data[0]['age'];
$role = $data[0]['role'];


?>

<!-- Formular pre editovanie usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">

<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">

<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">

<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">

<input type="hidden" name="id_user" value="<?php echo $id_user;?>">

<input type="submit" name="edit_user_form" value="Odoslať">
</form>

<?php


}else{
echo '<p class="error">Nepodarilo sa načítať dáta pre editovanie.</p>';
}


}else{
echo '<p class="error">Parameter používateľa pre editáciu sa nepodarilo načítať.</p>';
}

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>

</div>

</body>
</html>

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

oopoop v phpobjektovo orientovanie programovaniephp objektyphp newconstructobjektove phpclasstrieda

IT ftip

Čo je výnimočné na Windows 9x? Mrznú aj v lete.