Zmazanie dát v databáze
Ešte predtým, než sa pustíme do skompletizovania správy našej tabuľky v databáze cez našu webovú stránku umožnením dané záznamy z databázy zmazať, všimnite si ešte jednu dôležitú vec v predchádzajúcom kóde (v súbore uprava-zaznamu.php). Všade, kde môže nastať nejaká chyba, máme podmienku if a len v prípade korektného postupu v kóde pokračujeme v programe ďalej. Postupne od hora dole si v kóde testujeme, či máme spojenie s databázou (if (!$connection) {). Ak nie, tak vypíšeme používateľovi hlášku, aby vedel, že prečo sa mu napríklad nezobrazil formulár pre editovanie. Podobne ďalej je napríklad otestované, či sa nám podarilo načítať a či nám nejaký parameter prišiel (if($id_user){) a následne, či sa nám podarilo načítať nejaké dáta (if (mysqli_num_rows($result) > 0) {).
Skúste si niečo naschvál pokaziť – zmeniť heslo do db (na zlé), zle načítať parameter (napr. $id_user = $_GET['id_userxxx'];) a uvidíte, že sa nám pekne vypíše chybová hláška a stránka sa zobrazí korektne, nenastane žiadna chyba. Ak v kóde nastane chyba, napríklad nemáme niekde bodkočiarku alebo uzavretú množinovú zátvorku nejakého ifu, zobrazí sa nám iba škaredá prázdna biela strana. Samozrejme, pri všetkom korektnom (pripojenie do db v pohode, správne načítaný parameter a následne dáta z databázy) nie je nutné takto všetko ''ifovať'' (ošetrovať). Ako sme už dávnejšie ale spomenuli, program (stránka, kód...) musí fungovať vždy a všade a za všetkých podmienok, takže my nevieme, kedy sa hocičo môže stať (spadne databázový server alebo niekto zo srandy zmení hodnotu parametra v URL na niečo blbé). Preto je takto písať kód dobrým zvykom. Všetko, kde môže nastať nejaká chyba a program by mohol spadnúť, treba takto ošetriť a používateľ bude vždy vedieť, čo sa stalo (ak nastane chyba).
Poďme ale k aktuálnej úlohe, keď vieme záznamy pridávať a editovať, ostáva nám už len spraviť ich vymazávanie. Toto by nemal byť pre nás žiadny problém, takže poďme rýchlo na to. Do posledného stĺpca si pridáme druhý odkaz pre vymazanie záznamu. Zamyslite sa, čo by sa malo stať po kliknutí na tento odkaz. Aká stránka sa načíta a čo sa na nej stane. Dalo by sa to riešiť cez novú stránku, kde by bolo podobne ako pri editovaní info, ktorá položka sa ide zmazať a následne po kliknutí na nejaký submit button by sa položka skutočne vymazala. Tento medzikrok (presmerovanie na novú stránku a znova potvrdenie) je zbytočný. Urobíme to bez vytvorenia novej stránky, jednoducho aby sa hneď po kliknutí na odkaz vymazania položka vymazala. Viete, ako by ste to mohli spraviť?
Odpoveď je jasná, keďže sa nechceme nikde inde presmerovávať, tak musíme volať našu stránku (index.php). Následne v kóde ale musíme rozlýšiť, resp. zachytiť situáciu, kedy sme sa na túto stránku dostali z kliknutia na odkaz pre vymazanie záznamu. Je to v podstate situácia, kedy musíme dať našej stránke niečo vedieť a ako vieme, informácie stránke môžeme zadávať napríklad cez URL. Takže riešenie nášho problému je, že pomocou odkazu pre vymazanie záznamu dáme stránke najavo, že chceme niečo mazať a následne čo chceme mazať, takže si prepošleme nejaké dáta o danom zázname. Následne bude položka vymazaná.
Nie je to nič nové, mali by sme to zvládnuť. Mohlo by to teda vyzerať takto:
index.php (obsah poslednej bunky v tabuľke používateľov):
echo '<td>';
echo '<a href="uprava-zaznamu.php?id_user='.$data[$i]['id'].'">Upraviť záznam</a><br><br>';
echo '<a href="index.php?id_user='.$data[$i]['id'].'">Vymazať záznam</a>';
echo '</td>';
Keďže si na stránku index.php neposielame v žiadnom momente nejaké parametre cez URL, stačí do nášho odkazu pridať len jeden parameter (id usera), na ktorý sa v kóde budeme odkazovať. Budeme sa pýtať, či nám niečo prišlo. Ak áno, tak budeme vedieť, že to prišlo z tohto odkazu a že máme daný záznam vymazať. Ak by sme ale mali viacero momentov, keby nám chodili parametre, napríklad aj tento id_user, napríklad keby sme mali editovanie cez túto istú stránku, tak by sme si poslali ešte jeden parameter, ktorý by slúžil ako indikátor, že sme prišli na stránku s cieľom niečo zmazať. Mohli by sme posielať ešte jeden parameter napríklad action_type=delete a následne by sme sa pýtali, či nám prišla hodnota delete, ktorá by značila mazanie záznamu.
Keďže nám to ale netreba, stačí poslať iba toto id a následne spracovať zachytenie parametra a následne vymazanie položky v databáze. Toto by sme mali zvldnúť, nezabudnúť hlavne na klauzulu WHERE a v príkaze DELETE. Aby sa nám zoznam v tabuľke používateľov rovno načítal bez mazanej položky, umiestnime tento kód niekde pred načítanie dát, aby nebol nutný refreš. Mohlo by to vyzerať takto:
index.php (po pripojení do databázy pred zachytenie parametrov):
…
//MAZANIE POLOZKY
$id_user = $_GET['id_user'];
if($id_user){
$sql_query = "DELETE FROM users WHERE id=".$id_user;
$result = mysqli_query($connection, $sql_query);
if($result){
echo '<p class="success">Položka bola úspešne zmazaná.</p>';
}else{
echo '<p class="error">Pri mazaní položky sa vyskytla chyba.</p>';
}
}
…
Ako vidíte, iba sme zachytili parameter, ktorý nám nemá kedy inokedy prísť, iba v momente, keď sa klikne na tlačítko zmazať položku. Ak nám teda nejaký prišiel, vykonáme príkaz na delete a následne zobrazíme používateľovi hlášku. Ak si to vyskúšate, tak uvidíte, že to skutočne funguje a že sa dole zobrazený zoznam zobrazí už bez mazanej položky.
Pekné však? Teraz už vieme úplne spravovať záznamy v tabuľke users pomocou našej webstránky. Naprogramovali sme funkcionalitu troch základných operácií a to vloženie nového záznamu (insert into), editácie existujúceho záznamu (update) a vymazaniu existujúceho záznamu (delete). Možno ste sa zamysleli, prečo sa to vlastne robí takto, prečo sa to nerobí priamo napríklad cez phpMyAdmin. Že to, čo sme naprogramovali, je v podstate len obkľuka toho, aby sme tie príkazy zadali priamo v systéme na zadávanie SQL query.
Na jednej strane máte pravdu. Áno, je to robota na vyše a áno, dá sa to robiť všetko priamo cez systém. Ale má to nespočetne veľa dôvodov, prečo sa to robí takto. Najväčším je asi bezpečnosť. Ako sme si viackrát povedali, dáta sú vo väčšine vždy to najcennejšie a najdôležitejšie pre každý systém. Keby sa operácie vykonávali priamo v systéme, jedno zlé kliknutie alebo zle zadaný príkaz (delete) by mohol znamenať nenávratné stratenie dát. Pri vykonávaní query cez takýto webový systém, ako máme my, je v kóde viacero momentov, kedy sa testuje, či sa naozaj ide vymazať to čo chceme a či sa to má naozaj v danom momente vymazať, veľa vecí sa ifuje a podobne.
Druhá vec je ľahkosť ovládania. Keby ste túto našu webstránku ukázali niekoľkým aj menej počítačovo zdatným ľuďom a povedali im, keď klikneš sem, toto sa zmaže, keď klikneš sem, tu si to môžeš upraviť a podobne, tak by to zrejme pochopil každý. Ale viete si predstaviť, ako každého učíte jazyk SQL a vysvetľujete im, ako sa robí so systémom phpMyAdmin? Asi by to bolo o dosť komplikovanejšie a vo väčšine prípadov nemožné. Tvorba informačných systémov sa dá preto skrátene popísať, že to je vlastne tvorba systému ľahko ovládateľného systému na spravovanie dát a troška podrobnejšie a programátorsky by sa dalo povedať, že to je aj programovanie akokeby nástroja pre prácu s databázou bez znalostí SQL a systémov na správu databázy.