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 9911×

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ů

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

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

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

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