IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Formulár a výpis dát z databázy do tabuľky v PHP

V minulej lekcii, Prvý databázová tabuľka a MySQL ovládače v PHP , sme sa pripojili k databáze a vložili do nej niekoľko užívateľov. V reálnych aplikáciách sa používatelia vkladajú pomocou formulára. Presne to sa dnes naučíme a tiež sa naučíme vypísať používateľa z databázy do HTML tabuľky. Budeme pokračovať v štýle čo najjednoduchšieho kódu.

Formulár

Pre vkladanie užívateľov do databázy si vytvoríme jednoduchú HTML stránku s jedným formulárom. Náš vkladacia dotaz upravíme tak, aby vkladal hodnoty z formulára. Uveďme si kompletný kód registračný aplikácie:

<!DOCTYPE html>
<html lang="cs-cz">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Registrace uživatele</title>
    </head>

    <body>

        <h1>Registrace uživatele</h1>

        <?php

        require_once('Db.php');
        Db::connect('127.0.0.1', 'databaze_pro_web', 'root', '');
        if ($_POST)
        {
            $datum = date("Y-m-d H:i:s", strtotime($_POST['datum_narozeni']));
            Db::query('
                INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni)
                VALUES (?, ?, ?)
            ', $_POST['jmeno'], $_POST['prijmeni'], $datum);

            echo('<p>Byl jste úspěšně zaregistrován.</p>');
        }
        ?>

        <form method="post">
            Jméno:<br />
            <input type="text" name="jmeno" /><br />
            Příjmení:<br />
            <input type="text" name="prijmeni" /><br />
            Datum narození:<br />
            <input type="text" name="datum_narozeni" /><br />
            <input type="submit" value="Registrovat" />
        </form>

    </body>
</html>

Kód je stále veľmi krátky. Vysvetlime si ho. Čo sa týka HTML, tak tam by malo byť všetko jasné. Formulár je jednoduchý a obsahuje 3 polia (meno, priezvisko, dátum narodenia) a odosielacie tlačidlo. Pretože form postráda atribút action, odošle sa na tú istú stránku.

V stránke je tiež PHP skript, ktorý sa pripojí k databáze. Podmienkou otestuje, či sa odoslala nejaké dáta formulárom. Ak áno, vykoná SQL dotaz, ktorý dáta do databázy vloží. Všimnime si troch vecí:

  1. Dátum musíme previesť z českého formátu (tak, ako ho zadal do políčka užívateľ, napr. 15.1.1989) do formátu MySQL (napr. 1989-15-1). To za nás urobí dvojice funkcií str_to_time () a date ().
  2. SQL dotaz je veľmi podobný tomu z minulého dielu. Už nevkladáme do všetkých stĺpcov, ale len do troch. Do stĺpca pocet_clanku sa vloží východisková hodnota, teda 0.
  3. Do dotazu tu už potrebujeme vložiť premenné z PHP (konkrétne od užívateľa z $ _POST). A teraz pozor: Premenné NIKDY! nevkladáme priamo do dotazu! Keby používateľ zadal namiesto mena nejaký SQL príkaz, tak by sa totiž do dotazu vložil a vykonal na našej databáze! Miesto parametrov v dotaze vždy píšeme otázniky a potom parametre odovzdáme v rovnakom poradí ako ďalšie parametre funkcie Db :: query ()! Túto chybu tu neustále opakujú začiatočníci stále a stále dokola, hazardujete so svojimi dátami a dátami vašich užívateľov!

Ukážme si ešte radšej, ako sa to nemá robiť:

// TENTO KÓD JE VELMI NEBEZPEČNÝ!
Db::query('
    INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni)
    VALUES ("'. $_POST['jmeno'] . '", "' . $_POST['prijmeni'] . '", "' . $datum . '")');

Premenné sú vložené priamo v SQL dotazu. Keď používateľ napíše do políčka pre meno tento reťazec:

", "", ""); DELETE FROM uzivatele; --

Zmaže nám všetkých užívateľov v databáze, pretože čo napísal sa vloží priamo do dotazu a príkaz sa vykoná. Tomuto útoku sa hovorí SQL injection. Zrovna proti tomuto prípadu je náš wrapper imúnny, pretože sú v ňom určité nastavenia, ktorá práve tento typ injekcie nepovolí. Nejedná sa však o predvolené nastavenia a v žiadnom prípade nezastaví ďalšie typy injekcií.

Kedykoľvek chceme do dotazu vložiť nejaký parameter, použijeme otáznik a napíšeme ho mimo dotaz! Databáza si tam potom parameter sama a bezpečne dosadí, nikdy to nerobte za ňu. Nikdy neprerušujte reťazec s SQL dotazom.

Pre istotu ešte raz tá istá časť kódu tak, ako sa správne:

Db::query('
    INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni)
    VALUES (?, ?, ?)
', $_POST['jmeno'], $_POST['prijmeni'], $datum);

Kód vyskúšajme. Vložme nejakého užívateľa:

Registrace uživatele
localhost
Registrace uživatele
localhost

A pozrime sa do databázy, že v nej naozaj je:

Používatelia v MySQL databáze - Databázy v PHP pre začiatočníkov

Výpis dát

Do nášho jednoduchého skriptu pridajme ešte výpis dát z databázy do HTML tabuľky. Tento PHP kód umiestnime na koniec doterajšieho PHP bloku:

$uzivatele = Db::queryAll('
    SELECT *
    FROM uzivatele
');
echo('<h2>Uživatelé</h2><table border="1">');
foreach ($uzivatele as $u)
{
    echo('<tr><td>' . htmlspecialchars($u['jmeno']));
    echo('</td><td>' . htmlspecialchars($u['prijmeni']));
    $datum = date("d.m.Y", strtotime($u['datum_narozeni']));
    echo('</td><td>' . htmlspecialchars($datum));
    echo('</td><td>' . htmlspecialchars($u['pocet_clanku']));
    echo('</td></tr>');
}
echo('</table>');

Najdôležitejšie je volanie funkcie Db :: queryAll (). To vykoná databázový dotaz, rovnako ako Db :: query () a zároveň vráti všetky riadky, ktoré dotaz vybral. Budeme ju používať pri čítaní a Db :: query () budeme používať pri zápise (pridanie, editácia, mazanie).

Samotný SQL dotaz obsahuje len 4 slová. Dal by sa preložiť ako "Vyber všetky stĺpce z užívateľov". Práve hviezdička označuje všetky stĺpce. Keďže neupresňuje ktorí užívatelia nás zaujímajú, vyberie dotaz všetky riadky z tabuľky.

Výsledkom dotazu je pole riadkov, ktoré si uložíme do premennej $ uzivatele. Následne pole proiterujeme pomocou foreach cyklu riadok po riadku a pre každý vyechujeme stĺpček do HTML tabuľky. Nezabudneme používať funkciu htmlspecialchars (), inak by si niekto mohol do mena vložiť JavaScript a ten by sa potom pri výpise mená spustil. Tomuto útoku sa hovorí XSS.

Pozrime sa na výsledok aplikácie:

Registrace uživatele
localhost

Môžete si skúsiť pridávať užívateľov, budú sa objavovať v tabuľke. To by bolo pre dnešné lekciu všetko. Dúfam, že sa mi podarilo prelomiť ľady a že ste úspešne vytvorili svoju prvú databázovú aplikáciu. V lekcii budúci, Programujeme neobjektové redakčný systém v PHP (Ners) , začneme pracovať na sľúbenom redakčnom systéme. Zdrojové kódy dnešné aplikácie sú ako vždy k stiahnutiu v prílohe.


 

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é 3842x (3.48 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Prvý databázová tabuľka a MySQL ovládače v PHP
Všetky články v sekcii
Databázy v PHP pre začiatočníkov
Preskočiť článok
(neodporúčame)
Programujeme neobjektové redakčný systém v PHP (Ners)
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
2 hlasov
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