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

> MySQL (69) - Prepared Statements

Prepared statemets alebo pripravené výrazy - čo vlastne sú, s čím nám pomáhajú a prečo ich používať? Odpoveď nájdete v tomto článku.

9.3.2011 00:00 | Marek Beleščiak | Články autora | přečteno 9096×

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

Prepared statemets alebo pripravené výrazy - čo vlastne sú, s čím nám pomáhajú a prečo ich používať? Odpoveď nájdete v tomto článku.

MySQL má ešte jednu schopnosť, o ktorej ste možno nevedeli. Tou schopnosťou sú pripravené výrazy (prepared statements). Statementy sú spôsob ako efektívnejšie a bezpečnejšie dotazovať databázu. Uveďme si teda malý príklad:

SELECT * FROM `Article` WHERE `id` = ?

Otáznik vo výraze zastupuje hodnotu ktorá sa naňho "lepí" a otáznik sa zmení na onú hodnotu. Znie to trochu zložito a aby som bol presný, ako to celé funguje uvediem kompletný príklad:

mysql> PREPARE my_stmt FROM "SELECT nickname FROM account WHERE id = ?"; Query OK, 0 rows affected (0,00 sec) Statement prepared mysql> SET @id = '17'; Query OK, 0 rows affected (0,00 sec) mysql> EXECUTE my_stmt USING @id; +----------+ | nickname | +----------+ | Tester | +----------+ 1 row in set (0,02 sec) mysql> SET @id = '18'; Query OK, 0 rows affected (0,00 sec) mysql> EXECUTE my_stmt USING @id; +----------+ | nickname | +----------+ | Tester2 | +----------+ 1 row in set (0,00 sec) mysql> DEALLOCATE PREPARE my_stmt; Query OK, 0 rows affected (0,00 sec)
Statement pripravíme nasledovane:
  1. Spustíme príkaz PREPARE, za ktorým nasleduje meno nového statementu, za ním ďalej nasleduje FROM a za ním nakoniec dané query uzavreté v úvodzovkách s otáznikmi namiesto hodnôt - pamätajte, že otázniky nikdy nedávame do úvodzoviek alebo apostrofov.
  2. Ďalej nasleduje lepenie hodnôt. Definícia je vlastne nastavenie premennej. Za každý otáznik jedna definícia, takže si dajte bacha, nech otáznikov není viac ako definícií alebo naopak definícií viac ako otáznikov. Definujeme ju príkazom SET @meno = "HODNOTA";.
  3. Keď už máme daný výraz pripravený, hodnoty máme priradené, spustíme ho príkazom: EXECUTE, za ktorým nasleduje meno nášho statementu, následne USING a naše na-definované premenné oddelené čiarkou (@param1, @param2, ...).
  4. A nakoniec, keď už daný pripravený výraz nebudeme ďalej potrebovať, jednoducho ho uvoľníme, a to príkazom DEALLOCATE PREPARE, za ktorým nasleduje meno nášho statementu.

Statementy sú rýchlejšie ako normálne query, pretože každé query musí prejsť parsovaním, zatiaľ, čo statement prejde iba raz, a to, keď ho vytvoríte, potom už len naňho "lepíte" iné hodnoty. Najviac pocítite rýchlostný rozdiel pri nahadzovaní záloh alebo pri opakovaní jedného príkazu dokola napr. INSERT. Je to taktiež bezpochyby bezpečnejší spôsob, pretože rozdeľuje logiku od dát a tak pomáha predísť veľmi známemu útoku SQL Injection. Za normálnych okolností musíte byť veľmi opatrní, keď vkladáte do dotazu pre MySQL vstupné dáta od užívateľa. Pri pripravených výrazoch vám stačí escapnuť zopár problémových znakov ako sú napr. úvodzovky, apostrof, spätné lomítko alebo ASCII nula.

Ešte je jedno riešenie, kde môžeme nabrať na rýchlosti, a ním je nový binárny protokol, ktorý môže používať prepared statementy. Pretože v normálnom protokole mysql aj klient vždy zmenía všetky dáta na reťazce, ktoré sú vo väčšine prípadov väčšie ako originálne dáta, a až na servery sa zmenia na správny typ. Binárny protokol tieto dáta nijako neprekladá a posiela ich v originálnej forme, čo je samozrejme výhodné, pretože to znižuje zátaž procesora a taktiež zaťaženie siete.

Aj napriek týmto všetkým výhodám, sa statementy nie vždy oplatí používať, a totiž ani na všetko ich nejde používať. Kompletný zoznam podporovaných funkcii pripravených statementov pre MySQL (5.5) je tu. Ďalší dôvod, prečo ich nepoužívať je fakt, že niekedy sú pomalšie ako normálne regulárne dotazy - a to väčšinou keď sa daný výraz spustí iba raz, ale stále tu máte výhodu v bezpečnosti, takže nechám na vás kedy použiť a naopak nepoužiť Prepared Statementy.

Pokiaľ ste niekedy robili s MySQL nemal by byť pre vás problém vytvoriť program, ktorý beží na tejto báze, pokiaľ nie, väčšina jazykov už túto podporu má, alebo ju bude mať v blízkom čase. Ako príklad uvediem napr. mysqli rozšírenie pre PHP.

Záverom si myslím, že ste nadobudli dostatočne informácií o pripravených výrazoch, a viete o ich výhodách i nevýhodách. Môžu byť naozaj kľúčom k rýchlosti, výkonu a bezpečnosti, ak sú dobré použíté.

Verze pro tisk

pridej.cz

 

DISKUZE

Rychlost 13.3.2011 17:06 Aleš Hakl




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