Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. Více informací:
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í.
Slevovy týden 3/50

3. diel - MySQL krok za krokom: Vkladanie a mazanie dát v tabuľke

V minulej lekcii, MySQL krok za krokom: Vytvorenie databázy a tabuľky , sme si vytvorili databázu a v nej tabuľku užívateľov.

Dnes budeme vkladať a mazať záznamy, teda používateľa.

Vloženie zápisu do tabuľky

Vloženie nového užívateľa si ukážeme opäť najprv cez phpMyAdmin. Rozkliknite si tabuľku uzivatele. V hornej lište vyberieme možnosť Vložiť. Vyplníme len polia v stĺpci Hodnota a pole uzivatele_id ponecháme prázdne. To sa vyplní samo vďaka vlastnosti AUTO_INCREMENT. Obsah polí vyplníme ako potrebujeme a potvrdíme tlačidlom Vykonaj:

Vloženie záznamu do tabuľky v phpMyAdmin

Teraz si tabuľku rozkliknite a vidíme, že Ján Novák je naozaj uložený v databáze.

phpMyAdmin nám ukázal ďalší SQL dotaz, tým je INSERT. Vložiť Jana Nováka by sme mohli rovnako aj týmto dotazom:

INSERT INTO `uzivatele` (
    `jmeno`,
    `prijmeni`,
    `datum_narozeni`,
    `pocet_clanku`
)
VALUES (
    'Jan',  'Novák',  '1984-11-03', 17
);

Prvý riadok je opäť jasný, proste hovoríme "Vlož do používateľov", ďalšie riadky sú stĺpce, v ktorých bude mať nová položka nejaké hodnoty. Stĺpec s id tu neuvádzame. Nasleduje slovo VALUES a ďalšie výpočet prvkov v zátvorkách, tentoraz hodnôt. Tie idú v tom poradí, aké sme uviedli u názvov stĺpcov. Textové hodnoty sú v úvodzovkách alebo apostrofmi, všetky hodnoty oddeľujeme čiarkami.

POZOR! Pokiaľ vkladáme do SQL dotazu text (tu treba meno používateľa), nesmie obsahovať úvodzovky, apostrofy a pár ďalších znakov. Tieto znaky samozrejme do textu zapísať môžeme, len sa musí ošetriť, aby si databázy nemyslela, že ide o časť dotazu. Ešte sa k tomu vrátime.

Teraz si pomocou SQL dotazu vložíme niekoľko užívateľov. Ak nemáte fantáziu, pokojne vložte tie prvé tri z tabuľky, ktorú sme mali v prvej lekcii:

Používatelia v MySQL tabuľke

SQL príkaz bude vyzerať napríklad takto:

INSERT INTO `uzivatele` (
    `jmeno`,
    `prijmeni`,
    `datum_narozeni`,
    `pocet_clanku`
)
VALUES ('Jan', 'Novák', '1984-11-03', 17),
       ('Tomáš', 'Marný', '1989-02-01', 6),
       ('Josef', 'Nový', '1972-12-20', 9),

Užívatelia v tabuľke v phpMyAdmin bude vyzerať takto:

Používatelia v MySQL tabuľke

Vymazanie záznamu

Skúsme si niekoho vymazať. Asi by ste prišli na to, že sa to robí tým červeným tlačidlom odstrániť. Skúste si to.

Vymazanie sa v jazyku SQL robí pomocou príkazu DELETE:

DELETE FROM `uzivatele` WHERE `uzivatele_id` = 2;

Skúste si to, phpMyAdmin je na DELETE opatrný a bude sa vás pýtať.

Príkaz je jednoduchý, voláme "vymaž z užívateľov", kde sa hodnota v stĺpci uzivatele_id rovná 2. Zamerajme sa na klauzulu WHERE, ktorá definuje podmienku. Stretneme ju aj v ďalších otázkach. Keďže tu natierame podľa primárneho kľúča, sme si istí, že vždy vymažeme práve jedného používateľa. Podmienku samozrejme môžeme rozvinúť, závorkovat a používať operátormi AND (a zároveň) a OR (alebo):

DELETE FROM `uzivatele` WHERE (`jmeno` = 'Jan' AND `datum_narozeni` >= '1980-1-1') OR (`pocet_clanku` < 3);

Príkaz vyššie vymaže všetky Jany, ktorí boli narodení po roku 1980 alebo všetkých užívateľov, ktorí napísali menej ako 3 články.

POZOR!, Nikdy na klauzulu WHERE nezabudnite, ak napíšete len:

DELETE FROM `uzivatele`;

Budú vymazaní všetci užívatelia v tabuľke!

SQL injection

SQL injection je termín, označujúci narušenie databázového dopytu škodlivým kódom od užívateľa.

Rozhodol som sa túto pasáž vložiť hneď na začiatok seriálu. Ak vás nejako zmätie, tak si z toho nič nerobte, hlavné je o riziku vedieť, rovnako si bezpečnú prácu s databázou ukážeme vždy pri príslušnom jazyka.

Čo je SQL injection

Predstavme si, že naša tabuľka s užívateľmi je súčasťou databázy nejakej aplikácie. A tiež, že umožníme užívateľovi (našej aplikácie) mazať užívateľa podľa priezviska. Do dotazu vložíme teda nejakú premennú, ktorá pochádza od užívateľa:

DELETE FROM `uzivatele` WHERE `prijmeni` = '$prijmeni';

$prijmeni je premenná, obsahujúci potrebné tento text:

Novák

Otázka sa teda utvorí takto:

DELETE FROM `uzivatele` WHERE `prijmeni` = 'Novák';

Dotaz sa vykoná a vymaže všetky Nováky. To znie ako to, čo sme chceli. Teraz si ale predstavte, čo sa stane, keď niekto do premennej zadá toto:

' OR 1 --

Výsledný dotaz bude vyzerať takto:

DELETE FROM `uzivatele` WHERE `prijmeni` = '' OR 1 --';

Pretože 1 je z logického hľadiska vždy pravda a v podmienke je, že buď musí mať užívateľ prázdne priezvisko alebo musí platiť pravda (čo platí), vymaže dotaz všetkých užívateľov v tabuľke. Posledný úvodzovky sa útočník zbavil komentárom (dve pomlčky), ktorý v dotaze zruší všetko do konca riadku.

Šikovnejší útočníci dokážu urobiť injekciu v ktoromkoľvek SQL príkazu, nielen v DELETE.

Riešenie

Nebojte, riešenie je veľmi jednoduché. Problém robí niekoľko špeciálnych znakov v premennej, ako sú úvodzovky a niekoľko ďalších. Ak tieto znaky potrebujeme, musíme ich tzv. Odescapovat, teda predsadiť spätným lomítkom. V aplikácii to za nás nejakým spôsobom rieši ovládač databázy, buď to robí úplne sám alebo dáta musíme pomocou neho pred vložením do dotazu najprv odescapovat. Určite si to zistite, ako začnete s databázou pracovať. Ak budete používať tunajšie návody, bude to v nich vždy uvedené.

Odescapovaný dotaz by vyzeral takto:

DELETE FROM `uzivatele` WHERE `prijmeni` = '\' OR 1 --';

Takýto dotaz je neškodný, pretože časť vložená užívateľom je považovaná ako text. V texte sa nevyhodnotí úvodzovky a tým pádom ani komentár. Ďalším variantom, ako aplikáciu zabezpečiť proti injekciu, je obsah premennej do dotazu vôbec nezadávať. V dotaze sú potom uvedené iba zástupné znaky (otázniky):

DELETE FROM `uzivatele` WHERE `prijmeni` = ?;

A premenné sa pošlú databázu potom zvlášť a naraz. Ona si ich tam sama navkládá tak, aby nevzniklo žiadne nebezpečenstvo. To je však teória okolo konkrétneho ovládača databázy a ako bolo povedané, nájdete ju u jazyka, z ktorého budete s databázou komunikovať (napr. V sekcii PHP).

Editácia záznamov

Databáza umožňuje 4 základné operácie, ktoré sú často označované skratkou CRUD (C reate, R ead, U pdate, D élet). Sú to teda vytvorenie záznamu, načítanie (vyhľadanie), update (editácia) a vymazanie záznamu. Vytvorenie a vymazanie už vieme. Chýba nám teda ešte editácie a vyhľadávania. Vyhľadávanie venujeme celý budúci článok, editáciu si vysvetlíme ešte dnes.

Na editáciu v konfigurácii phpMyAdmina by ste určite prišli, stačí rozkliknúť tabuľku a pri danom zázname kliknúť na Upraviť. K úprave slúži SQL dotaz UPDATE, úprava nejakého užívateľa by vyzerala asi takto:

UPDATE `uzivatele` SET `prijmeni` = 'Dolejší', `pocet_clanku` = `pocet_clanku` + 1 WHERE `uzivatele_id` = 1;

Za kľúčovým slovom UPDATE nasleduje názov tabuľky, potom slovo SET a vždy názov stĺpca = hodnota. Môžeme meniť hodnoty viac stĺpcov, iba sa oddelí čiarkou. Môžeme dokonca použiť predchádzajúca hodnotu z databázy a treba ju zvýšiť o 1, ako v ukážke vyššie.

Nabudúce, v lekcii MySQL krok za krokom: Výber dát (vyhľadávanie) , sa pozrieme na výber dát z databázy, čiže vyhľadávanie.


 

Predchádzajúci článok
MySQL krok za krokom: Vytvorenie databázy a tabuľky
Všetky články v sekcii
MySQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
MySQL krok za krokom: Výber dát (vyhľadávanie)
Článok pre vás napísal David Čápka
Avatar
Užívateľské hodnotenie:
2 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 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