Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. 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í.

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 av nej tabuľku užívateľov.

V tomto MySQL tutoriále si do tabuľky užívateľov vložíme prvé záznamy. Potom si ukážeme, ako vybraný záznam zmazať alebo editovať.

Vloženie záznamu do tabuľky

Vloženie nového užívateľa si ukážeme opäť najskôr cez phpMyAdmin.

Pridanie užívateľa v phpMyAdmin

Rozklikneme si tabuľku users. V hornej lište vyberieme možnosť Insert. V novom okne vyplníme iba pole v stĺpci Value. Pole user_id ponecháme prázdne, vyplní sa samo vďaka vlastnosti AUTO_INCREMENT, ktorú sme mu predtým nastavili. Obsah polí vyplníme, ako potrebujeme a potvrdíme tlačidlom Go:

Vloženie záznamu do tabuľky v phpMyAdmin - MySQL databázy krok za krokom

phpMyAdmin nám potom ukáže ďalší SQL dotaz, tým je INSERT. Vložiť John Smith by sme mohli rovnako aj touto otázkou:

INSERT INTO `users` (
    `user_id`,
    `first_name`,
    `last_name`,
    `birthdate`,
    `article_count`
)
VALUES (NULL, 'John', 'Smith', '1984/3/11', '17');

Prvý riadok je jasný, jednoducho hovoríme "Vlož do užívateľov", na ďalších riadkoch uvádzame stĺpce, v ktorých bude mať nová položka nejaké hodnoty. Stĺpec user_id tu uvádzať nemusíme. Nasleduje slovo VALUES a ďalší zoznam prvkov v zátvorkách. Tentokrát ide o hodnoty, ktoré do tabuľky chceme pridať. Tie sú uvedené v rovnakom poradí, ako názvy stĺpcov vyššie. Textové hodnotyv úvodzovkách alebo apostrofoch, všetky hodnoty oddeľujeme čiarkami.

Pokiaľ vkladáme do SQL dotazu text obsahujúci úvodzovky alebo apostrofy (napríklad O'Connor) a pár ďalších znakov, musíme ho ošetriť, aby databáza vedela, že ide o časť textu. V opačnom prípade by takýto znak považovala za ukončenie reťazca a dotaz by vyhodnotila ako chybný. Ešte sa k tomu vrátime.

Teraz si tabuľku znova rozklikneme a vidíme, že John Smith je skutočne uložený v databáze:

Zobrazenie vloženého záznamu v phpMyAdmin_AJ - MySQL databázy krok za krokom

Pridanie užívateľa SQL dotazom

Poďme si pridať do našej tabuľky ďalších užívateľov. Tentoraz si vyskúšame napísať vlastnú SQL otázku. Do tabuľky ním vložíme ďalších troch užívateľov:

First name Last name Date of birth Number of articles
John Smith 1984/3/11 17
Thomas Brown 1989/2/1 6
Jack Newman 1972/12/20 9
Mary Emmerson 1990/8/14 1

V dotaze môžeme uviesť hodnoty pre všetkých troch užívateľov. Výsledný SQL dotaz bude vyzerať takto:

INSERT INTO `users` (
    `user_id`,
    `first_name`,
    `last_name`,
    `birthdate`,
    `article_count`
)
VALUES (NULL, 'Thomas', 'Brown', '1989/2/1', '6'),
       (NULL, 'Jack', 'Newman', '1972/12/20', '9'),
       (NULL, 'Mary', 'Emmerson', '1990/8/14', '1').

Tabuľka s novo pridanými užívateľmi bude v phpMyAdmin vyzerať takto:

Zobrazenie pridaných používateľov v phpMyAdmin - MySQL databázy krok za krokom

Vymazanie záznamov

Skúsme si aj niekoho vymazať. V phpMyAdmin jednoducho klikneme na červené tlačidlo Delete. Otvorí sa nám dialógové okno, v ktorom máme potvrdiť zmazanie záznamu. V ňom je tiež uvedený zodpovedajúci SQL dotaz:

Potvrdenie zmazania používateľa - MySQL databázy krok za krokom

Príkaz DELETE FROM

V jazyku SQL vyzerá odstránenie pomocou príkazu DELETE takto:

DELETE FROM `users` WHERE `user_id` = 1;

Skúsme si ešte zmazať Mary Emmerson, phpMyAdmin je na mazanie opatrný, vykonanie príkazu budeme musieť v ďalšom okne znova potvrdiť.

Príkaz je jednoduchý, voláme "vymaž z užívateľov", kde sa hodnota user_id rovná 1.

Zamerajme sa na klauzulu WHERE, ktorá definuje podmienku. Stretneme ju aj v ďalších otázkach. Keďže tu mažeme podľa primárneho kľúča, sme si istí, že vždy vymažeme práve jedného užívateľa. Podmienku samozrejme môžeme rozvinúť, zátvorkovať a používať operátory AND (a zároveň) a OR (alebo):

DELETE FROM `users` WHERE (`first_name` = 'Mary' AND `birthdate` >= '1990-08-14') OR (`article_count` < 2);

Taký príkaz vyššie vymaže všetkých 'Mary', ktorí boli narodení po roku 1990 alebo všetkých užívateľov, ktorí napísali menej ako jeden článek.

Pri príkaze DELETE nikdy nesmieme klauzulu WHERE zabudnúť uviesť! Pokiaľ napíšeme len DELETE FROM 'users';, budú vymazaní všetci používatelia v tabuľke.

Príkaz TRUNCATE TABLE

Niekedy však môžeme zámerne chcieť vymazať všetky údaje našej tabuľky. V takom prípade je však lepšie použiť príkaz TRUNCATE TABLE, ktorý tiež vymaže všetky záznamy. V SQL sa zapíše takto:

TRUNCATE TABLE `users`;

Rovnako ako pri príkaze DELETE, aj príkaz TRUNCATE si phpMyAdmin stráži a pre istotu sa nás pred vykonaním spýta.

Prečo si teda pamätať príkaz TRUNCATE TABLE, keď funguje v podstate rovnako ako DELETE FROM bez použitia podmienky? Príkaz TRUNCATE TABLE oproti DELETE FROM:

  • je rýchlejší,
  • nevyžaduje oprávnenie DELETE pre tabuľku,
  • nespúšťa triggery, čo sa občas môže hodiť,
  • vyresetuje AUTO INCREMENT späť na počiatočnú hodnotu.

Čo sú to trigerry sa dozvieme neskôr v lekcii MySQL krok za krokom - Triggery.

SQL injection

SQL injection je termín, označujúci narušenie databázového dotazu škodlivým kódom od užívateľa. Spomíname ju hneď na začiatok seriálu, aby sme o možnom riziku vedeli. Ako bezpečne pracovať s databázou si ukážeme neskôr vždy pri príslušnom jazyku.

Príklad na SQL injection

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

DELETE FROM `users` WHERE `last_name` = '$last_name';

Položka $prijmeni je premenná, obsahujúca napríklad tento text:

Brown

Otázka sa teda zostaví takto:

DELETE FROM `users` WHERE `last_name` = 'Brown';

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

' OR 1 --

Výsledná otázka bude vyzerať takto:

DELETE FROM `users` WHERE `last_name` = '' OR 1 --';

V podmienke teraz je, že buď musí mať používateľ prázdne priezvisko alebo musí platiť, že 1 je pravda (čo platí). Tento dotaz teda vymaže všetkých užívateľov v našej tabuľke. Posledné úvodzovky sa útočník zbavil komentárom. Ten v SQL uvádzajú dve pomlčky a zrušia tak všetko do konca riadku.

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

Ochrana proti SQL injection

Riešenie problému je veľmi jednoduché. Už vieme, že ho spôsobuje niekoľko špeciálnych znakov v premennej, ako sú úvodzovky a podobne. Pokiaľ tieto znaky potrebujeme, musíme ich tzv. odescapovať, 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 pred vložením do dotazu sami najprv odcapovať.

Spätné lomeno

Spätné lomeno na slovenskej klávesnici môžeme napísať pomocou pravého Alt a písmena Q:

Spätné lomítko na klávesnici - MySQL databázy krok za krokom

Odescapovaný dotaz by vyzeral takto:

DELETE FROM `users` WHERE `last_name` = '\' OR 1 --';

Takáto otázka je neškodná, pretože apostrof vložený užívateľom je považovaný za text. Nevyhodnotia sa teda ako ukončenie reťazca a tým pádom ani dve pomlčky nebudú považované za komentár.

Ďalším variantom, ako aplikáciu zabezpečiť proti injekcii, je obsah premennej do dotazu vôbec nezadávať. V dotaze sú potom uvedené iba zástupné znaky (otázniky):

DELETE FROM `users` WHERE `last_name` = ?;

Premenné sa potom pošlú databáze osobitne a naraz. Ona si ich do otázok sama navkladá 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 pri jazyku, z ktorého budete s databázou komunikovať.

Editácia záznamov

Databáza umožňuje štyri základné operácie, ktoré sú často označované skratkou CRUD:

  • Create – vytvorenie záznamu,
  • Read – načítanie alebo vyhľadanie záznamu,
  • Update – editácia záznamu,
  • Delete – vymazanie záznamu.

Vytvorenie a vymazanie záznamu už vieme. Chýba nám teda ešte editácia a vyhľadávanie. Vyhľadávanie venujeme samostatnú lekciu MySQL krok za krokom - Výber dát (vyhľadávanie), editáciu si vysvetlíme ešte dnes.

Editácia v phpMyAdminu nie je opäť nijako zložitá. Stačí rozkliknúť tabuľku a pri danom zázname kliknúť na možnosť Edit. V SQL slúži na úpravu dát dotaz UPDATE. Pre úpravu dát nejakého používateľa by sme ho zapísali napríklad takto:

UPDATE `users` SET `last_name` = 'Brown', `article_count` = `article_count` + 1 WHERE `user_id` = 3;

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

V ďalšej lekcii, MySQL krok za krokom - Export , si ukážeme rôzne typy exportov databázy.


 

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 - Export
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
3 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