IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

8. diel - Výpis článkov z databázy v PHP (MVC)

V minulej lekcii, Databázový wrapper , sme si vytvorili databázový wrapper nad PHP ovládačom PDO. Databáze máme už tiež pripravenú, nič nám nebráni s ňou komunikovať.

Pripojenie

Ako prvé sa musíme k databáze pripojiť. To vykonáme v index.php, tesne pred vytvorením smerovača:

// Připojení k databázi
Db::pripoj("127.0.0.1", "root", "", "mvc_db");

Údaje si samozrejme zmeňte podľa svojho webhostingu, takto sú vyplnené pre localhost. Databáze máme v aplikácii prístupnú, poďme sa ju na niečo opýtať.

Model - Správca článkov

Vytvoríme triedu s logikou ohľadom práce s článkami, ktorá bude obsahovať jednotlivé SQL dotazy. Trieda bude samozrejme v modeloch a vymenovať sa bude SpravceClanku. Pre každú databázovú entitu si v našom systéme vytvoríme nejakú podobnú triedu. SpravceClanku bude mať nasledujúce podobu:

<?php

// Třída poskytuje metody pro správu článků v redakčním systému
class SpravceClanku
{

    // Vrátí článek z databáze podle jeho URL
    public function vratClanek($url)
    {
        return Db::dotazJeden('
            SELECT `clanky_id`, `titulek`, `obsah`, `url`, `popisek`, `klicova_slova`
            FROM `clanky`
            WHERE `url` = ?
        ', array($url));
    }

    // Vrátí seznam článků v databázi
    public function vratClanky()
    {
        return Db::dotazVsechny('
            SELECT `clanky_id`, `titulek`, `url`, `popisek`
            FROM `clanky`
            ORDER BY `clanky_id` DESC
        ');
    }

}

Trieda má celkom 2 metódy:

  • vratClanek () vracia jeden článok z databázy podľa jeho URL. Získavanie dát od užívateľa nie je záležitosť modelu, všimnite si, že URL mu jednoducho príde v argumentu metódy a nerieši odkiaľ sa vzalo. Do podmienky SQL dotazu premennú nevložíte priamo, ale namiesto jej hodnoty vložíme zástupný znak (otáznik). Všetky parametre SQL dotazu následne odovzdáme databázu ako hodnoty v poli, ona si ich do dotazu sama a bezpečne dosadí.
  • vratClanky () vracia zoznam všetkých článkov (bez ich obsahu). Články sú zoradené zostupne podľa ID, teda od najnovších po najstaršie. Všimnite si, že nevyberáme ich obsah, metódu budeme používať iba pre výpis zoznamu.

Pohľady

Budeme potrebovať 2 pohľady. Jeden pre článok a druhý pre zoznam článkov.

Clanek.phtml

Pri článku vypíšeme nadpis a potom jeho obsah. Pohľad bude nasledujúci:

<header>
    <h1><?= $titulek ?></h1>
</header>
<section>
    <?= $obsah ?>
</section>

Druhý pohľad necháme na koniec lekcie.

Kontrolér

Máme model, máme pohľad, zostáva náš známy prostredník - kontrolér, ktorý všetko spojí dohromady. ClanekKontroler bude mať nasledujúce podobu:

class ClanekKontroler extends Kontroler
{
    public function zpracuj($parametry)
    {
        // Vytvoření instance modelu, který nám umožní pracovat s články
        $spravceClanku = new SpravceClanku();

        // Získání článku podle URL
        $clanek = $spravceClanku->vratClanek($parametry[0]);
        // Pokud nebyl článek s danou URL nalezen, přesměrujeme na ChybaKontroler
        if (!$clanek)
            $this->presmeruj('chyba');

        // Hlavička stránky
        $this->hlavicka = array(
            'titulek' => $clanek['titulek'],
            'klicova_slova' => $clanek['klicova_slova'],
            'popis' => $clanek['popis'],
        );

        // Naplnění proměnných pro šablonu
        $this->data['titulek'] = $clanek['titulek'];
        $this->data['obsah'] = $clanek['obsah'];

        // Nastavení šablony
        $this->pohled = 'clanek';
    }
}

Kontrolér si vytvoria model a získa od neho článok podľa URL adresy. Pokiaľ článok nebol nájdený, vyhodnotí sa premenná s ním ako false a presmerujeme na ChybaKontroler. Hlavičku stránky nastavíme podľa článku, ďalej pohľadu odovzdáme titulok a obsah, aby článok mohol vypísať. Nakoniec nastavíme pohľad na clanek.phtml.

Poďme si všetko vyskúšať. Keď aplikáciu zapneme, uvidíme vypísaný úvodný článok:

Úvod
localhost/cla­nek/uvod

Môžete si skúsiť zadať URL neexistujúceho článku, budete presmerovaní na chybovú stránku.

Clanky.phtml

Zoznam článkov bude o niečo zložitejšie, pretože potrebujeme vypísať ich zoznam z poľa článkov, ktoré dostaneme od databázy. Ako že to ale urobíme, keď zatiaľ vieme vypisovať len jednotlivé premenné a tu potrebujeme vypísať obsah kolekcie? Poďme si rozšíriť naše vedomosti o PHP syntax, presnejšie o šablónové verzii cyklov.

Šablónová syntaxe PHP

Okrem direktívy <? = Nám PHP ponúka šablónové ekvivalenty najbežnejších konštrukcií jazyka. Môžeme tak do pohľadu (šablóny) vložiť minimálnu časť logiky, ktorá nebude znepřehledňovat HTML kód. Tieto šablónové ekvivalenty nám totiž umožňujú vkladať PHP do HTML.

Bez znalosti šablónové syntaxe PHP by výpis zoznamu článkov do tabuľky vyzeral asi takto:

<h1>Seznam článků</h1>
<table>
    <?php
        foreach ($clanky as $clanek)
        {
            echo('<tr><td><h2>
                    <a href="clanek/' . $clanek['url'] . '">
                            ' . $clanek['titulek'] . '</a>
                    </h2>' . $clanek['popisek']);
            echo('</td></tr>');
        }
    ?>
</table>

HTML je nezvyrazneny, šablóna neprehľadná., Strácame sa v úvodzovkách ako reťazca spájame. Poďme kód previesť do šablónové verzia:

<h1>Seznam článků</h1>
<table>
<?php foreach ($clanky as $clanek) : ?>
    <tr>
        <td>
            <h2><a href="clanek/<?= $clanek['url'] ?>"><?= $clanek['titulek'] ?></a></h2>
            <?= $clanek['popisek'] ?>
        </td>
    </tr>
<?php endforeach ?>
</table>

Všimnite si, že cyklus foreach má za sebou napísanú dvojbodku a potom sa ukončí PHP direktíva. Toto je šablónová verzia foreach, ktorá pre každý prvok vyechuje HTML kód, ktorý je napísaný pod ním a to až do značky endforeach. Podobne možno prepísať aj cykly for a while alebo podmienky if. HTML je zapísané ako HTML, nie ako string. Premenné vložíme do HTML pomocou <? =, Ako sme zvyknutí. Súbor clanky.phtml si s týmto obsahom v priečinku pohľady vytvorte.

Pozn .: V šablónach stále neošetrujeme HTML entity a vystavujeme sa tak útoku XSS. Napravíme to hneď v budúcom dieli.

Úprava ClanekKontroler

Zoznam článkov bude vypisovať ClanekKontroler a to v prípade, keď mu nezadáme žiadny parameter. Kontrolér jednoducho podmienkou rozpolíme na dve časti. Jedna vypisuje konkrétny článok a druhá zoznam. Pre tieto akcie by sa dali použiť 2 kontrolery, ale zvyčajne sa zapisujú do jedného, keď spolu úzko súvisia. Metódu spracuj () upravíme do nasledujúcej podoby:

public function zpracuj($parametry)
{
    // Vytvoření instance modelu, který nám umožní pracovat s články
    $spravceClanku = new SpravceClanku();

    // Je zadáno URL článku
    if (!empty($parametry[0]))
    {
        // Získání článku podle URL
        $clanek = $spravceClanku->vratClanek($parametry[0]);
        // Pokud nebyl článek s danou URL nalezen, přesměrujeme na ChybaKontroler
        if (!$clanek)
            $this->presmeruj('chyba');

        // Hlavička stránky
        $this->hlavicka = array(
            'titulek' => $clanek['titulek'],
            'klicova_slova' => $clanek['klicova_slova'],
            'popis' => $clanek['popisek'],
        );

        // Naplnění proměnných pro šablonu
        $this->data['titulek'] = $clanek['titulek'];
        $this->data['obsah'] = $clanek['obsah'];

        // Nastavení šablony
        $this->pohled = 'clanek';
    }
    else
    // Není zadáno URL článku, vypíšeme všechny
    {
        $clanky = $spravceClanku->vratClanky();
        $this->data['clanky'] = $clanky;
        $this->pohled = 'clanky';
    }
}

Teraz prejdime na kontrolér clanek a nezadáme URL článku, ktorý sa má zobraziť. Zobrazí sa zoznam všetkých článkov na webe:

Tvoja stránka
localhost/clanek/

V budúcej lekcii, Zabezpečenia šablón , sa budeme venovať zabezpečenia šablón proti XSS.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1956x (15.08 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Databázový wrapper
Všetky články v sekcii
Jednoduchý redakčný systém v PHP objektovo (MVC)
Preskočiť článok
(neodporúčame)
Zabezpečenia šablón
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity