LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (42) - Odstraňujeme databázová data

Pakliže se Vám data v databázi nelíbí, je tento díl seriálu přesně pro vás. Dozvíte se totiž, jak je mazat.

25.8.2004 15:00 | Petr Zajíc | Články autora | přečteno 32978×

Komerční sdělení: Pořádáme Kurzy PHP

Někdy bývá potřeba data z databáze nemilosrdně odstranit. Pojďme si povědět, jak na tuto destruktivní činnost jít.

Smazat je smazat

Ideální je udělat následující zkušenost metodou pokus-omyl, protože potom si to zapamatujete. Data k odstranění budou SKUTEČNĚ odstraněna. Takže špatně napsaný odstraňovací dotaz Vám může celou databázi rozhodit. Proto opravdu profesionální databázové aplikace přímé mazání záznamů moc nepoužívají. V profi prostředí se většinou používá jeden nebo kombinace následujících přístupů:

  • Někdy se místo odstraňování záznamů vkládají záznamy s opačnými hodnotami (například faktura a stornodoklad).
  • Jindy se řádky nemažou, ale nastavuje se jim zvláštní příznak (existuje dejme tomu sloupec obsahující logickou hodnotu DELETED), aplikace pochopitelně musí být tomuto trendu přizpůsobena.
  • Ještě jindy se řádky sice z originální tabulky odstraní, ale nezmizí úplně, nýbrž jsou přesunuty do jiné tabulky (ta může mít stejnou strukturu jako tabulka původní).
  • Konečně se dělá to, že se protokolují odstraňovací dotazy (kdo a kdy to udělal), aby se případný viník mohl alespoň najít a zlynčovat.

Všimněte si, že první tři přístupy mají tu výhodu, že "smazání" lze vrátit zpět. Jsou to ale obecně poměrně pokročilá řešení, která mají také své nevýhody. Kdybyste se do toho chtěli někdy pouštět, měli byste vědět, že:

  • to bude obecně pomalejší než prosté odstranění dat
  • to bude vyžadovat větší prostor v databázi
  • bude to náročnější na programování
  • se to dá hodně zjednodušit použitím "chytřejších" databází

Pokud použijete PHP a MySQL a rozhodnete se pro některé z výše uvedených pokročilých řešení, budete si je muset víceméně napsat.

Pozn.: Tento typ úloh se nejlépe realizuje s databázemi, které umějí používat uložené procedury a triggery. MySQL zatím nic z toho neumí, měl by se to objevit v "pětkových" verzích. PostgreSQL umí obojí. Uložená procedura je programový kód, který se píše pomocí SQL a spouští se na databázovém serveru. Trigger je uložená procedura, která se na nějaké tabulce spustí vždy, když na ní dojde k definované operaci měnící data. Pomocí procedur a triggerů například vůbec není problém napsat kód, který při odstranění dat uloží kopii smazaných dat nějam jinam. Což je přesně jedna z metod popsaných výše. PHP o tom vůbec nemusí vědět.

Co umí MySQL

Především je potřeba si uvědomit, že někdy není nutné odstraňovat celý záznam (řádek). Často potřebujeme odstranit pouze hodnoty v nějakých sloupcích. K tomu slouží příkaz UPDATE, kterým můžeme nastavit hodnotu ve sloupci na NULL, neboli neznámou. Takže následující příkaz jazyka SQL je zcela legitimní:

UPDATE tabulka SET sloupec=NULL

O speciální hodnotě NULL jsme již v seriálu mluvili. Je to hodnota neznámá, takže se chová zvláštně. Počítejte s tím, že žádná hodnota NULL se nerovná jiné hodnotě NULL a že výsledek většiny matematických operací, jichž se účastní NULL jako jeden z členů je zase NULL. (Například NULL+3=NULL, protože když k neznámému číslu přičteme trojku, výsledek je zase neznámý). Zdůrazňuji to proto, že je snadné na to zapomenout. Tak například v tabulce zaměstnanců bychom si mohli myslet, že:

SELECT * FROM zamastnanci WHERE PLAT>10000
SELECT * FROM zamestnanci WHERE PLAT<=10000

vrátí dohromady všechny zaměstnance. Tak to nemusí nutně být; jestliže jsou ve sloupci PLAT povoleny hodnoty NULL (výše platu je neznámá!) mohou existovat řádky, které nejsou vráceny ani prvním, ani druhým dotazem. Takže pozor na to.

DELETE
Ke "klasickému" promazávání řádků z tabulky slouží příkaz DELETE. Jeho nejjednodušší syntaxe je:

DELETE FROM název_tabulky

Kterýžto příkaz odstraní všechny řádky z tabulky. Prakticky vždy se ale používá buďto ve spojení s klauzulemi WHERE nebo LIMIT. DELETE je opakem INSERTu a platí o něm plnou měrou to, co bylo řečeno v úvodu.

TRUNCATE TABLE
je příkaz podobný DELETE s tím rozdílem, že odstraňuje a znovuvytváří celkou tabulku. V praxi to může být podstatně rychlejší než použití DELETE, protože DELETE postupuje řádek po řádku. TRUNCATE TABLE se ovšem nedá použít s WHERE, protože maže vždy všechny záznamy.

Pozn.: Fungování TRUNCATE TABLE v MySQL se hodně měnilo v jednotlivých verzích databáze, takže pokud si nejste jisti co dělá vámi používaná verze MySQL, podívejte se do manuálu.

DROP TABLE
Jak po použití TRUNCATE TABLE, tak po použití DELETE tabulka jako taková v databázi samozřejmě zůstane, i kdyby měla být prázdná. Pokud budete chtít odstanit tabulku včetně její struktury, je tu příkaz DROP TABLE. Ten je pravým opakem CREATE TABLE.

DROP DATABASE
jak asi tušíte, tohle je nejsilnější "mazací" příkaz. Odstraní z databáze všechny tabulky, odstraní databázi jako takovou a odstraní fyzicky všechny soubory operačního systému, které byly pro provoz této databáze potřeba. Tohle by se mělo provádět jen ve výjímečných případech.

Pozn.: A v praxi si to asi nevyzkoušíte, protože na většině webhostingů k provedení tak destruktivní akce nebudete mít potřebná přístupová práva.

Mazání v PHP+MySQL

Už toho není mnoho, co bych mohl dodat. Rovněž pro zadávání odstraňovacích dotazů se v PHP používá funkce mysql_query. Platí pro ni de facto to, co jsme uvedli v minulém dílu o UPDATE. Stručně zopakujme:

  • mysql_affected_rows vrací počet aktualizovaných záznamů nebo -1, pokud dotaz selhal.
  • mysql_query vrací TRUE pokud se příkaz povedl, FALSE pokud selhal.
  • Pokud odstranění záznamu nějakým způsobem závisí na hodnotách zadaných uživatelem, měly by se tyto hodnoty pečlivě zkontrolovat ještě předtím, než je dotaz proveden.

Osobně se použití příkazu DELETE ve skriptech PHP dost bráním. Většinou to povoluji pouze v nějakém administrátorském rozhraní vybraným uživatelům. Využívám toho, že v DELETE lze použít jak klauzuli WHERE, tak i LIMIT. Ani tady dnes mazání neuvidíte, nepovedlo se mi vymyslet dostatečně praktickou a zároveň bezpečnou aplikaci, která by to ilustrovala.

V příštím díle se podíváme na některé tipy, které Vám pomohou zvýšit rychlost databázově závislých aplikací.

Verze pro tisk

pridej.cz

 

DISKUZE

záloha DB 26.8.2004 12:48 Jiří Hlinka
  L Re: záloha DB 26.8.2004 14:07 Jan Houštěk




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

12.8.2016 11:51 / Josef Zapletal
Jak udělat HTML/Javascript swiping gallery do mobilu?

8.8.2016 14:58 / Adams
fairies for hire

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze