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í:
- 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 ().
- 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.
- 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:
A pozrime sa do databázy, že v nej naozaj je:
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:
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é 3877x (3.48 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP