Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk Untitled - Vitajte na stránkach www.einsty.hostujem.sk

einsty.hostujem.sk
from einsty.hostujem.sk More from this publisher
11.07.2015 Views

P R O G R A M U J E M EZadáme teda:mysql> insert into zaner values (0, ‘poezia’);Preèo sme na prvú pozíciu zadali nulu?Keï sme tvorili tabu¾ku ZANER, urèili sme, že ståpec CIS_ODD bude ma autoinkrementaènúschopnos . Preto nie je potrebné zada do ståpca CIS_ODD príslušné poradové èíslo,napr. 1,2,3... Ak zadáme v každom pridaní záznamu pomocou insert into nulu, serversám za nás priradí prvé vo¾né poradové èíslo. Keï zadávame pridanie ïalších záznamov,znova na prvú pozíciu zapíšeme nulu, teda:mysql> insert into zaner values (0, ‘roman’);Pripomínam, že re azce sa zadávajú do apostrofov alebo do úvodzoviek. Keïže niektoréoperaèné systémy neuznávajú v textoch úvodzovky, my budeme používa univerzálnejšíapostrof.(Poznámka: Možno nás napadne, èi môžeme zadáva textové re azce s diakritikou.Odpoveï je trochu komplikovaná. Ak prostredie operaèného systému umožòuje písaa zobrazova znaky s diakritikou na obrazovke, môžeme túto možnos využi . Ale aknemáme MySQL server preložený s podporou triedenia pod¾a národnej abecedy,Obr. 3dostaneme v príkaze SELECT niekedy nežiaducu odpoveï. Ako mi je známe, prekladsamotného servera je možný iba v prostredí Linux, zatia¾ èo binárne súbory pre Windowsnie sú skompilované s národnou podporou. Nie je to neriešite¾né, ale zatia¾ v týchtocvièných aplikáciách budeme používa texty bez diakritických znamienok.)Ak sme nespravili žiadnu chybu, SQL server potvrdí vykonanie príkazu hlásením:Query OK, 1 row affected (0.22 sec)èo znamená asi to¾ko, že query – dopyt – bol správny, bol ovplyvnený jeden riadoka ko¾ko èasu trvalo vykonanie tohto query. Takto doplníme aj ostatné záznamy do tabu¾kyZANER:mysql> insert into zaner values (0, ‘krimi’);mysql> insert into zaner values (0, ‘detska lit.’);mysql> insert into zaner values (0, ‘cestopis’);mysql> insert into zaner values (0, ‘lit. faktu’);mysql> insert into zaner values (0, ‘odborna lit.’);Všimnime si, že sme nulu použili aj v ostatných zápisoch.Vyh¾adávanie záznamovAko sa presvedèíme, aké dáta máme uložené v tabu¾ke?Na to použijeme príkaz SELECT.Vieme, že úlohou príkazu SELECT je vybra z danej tabu¾ky urèité informácie na základestanovených kritérií. Je to jeden z najmocnejších príkazov v SQL štruktúre. Jeho mnohýmparametrom sa budeme postupne venova , zatia¾ nám staèí vedie najjednoduchší azároveò najvšeobecnejší zápis:mysql> select * from meno_tabu¾ky;Select znamená výber, * znamená všetko, from odkia¾ a za meno_tabu¾ky dosadíme užkonkrétne meno. V našom prípade príkaz select * from zaner znamená: vyber všetko ztabu¾ky ZANER a výsledok bude vyzera tak ako na obrázku è. 4.Obr. 4V prípade, že by sme rozhodovali pod¾a textového po¾a TEMATIKA, podmienka by vyzeralatakto:mysql> delete from zaner where tematika = ‘detska lit.’;Zmena záznamuNa zmenu obsahu urèitého záznamu sa používa príkaz UPDATE. Ten sme už raz použili,a to na zmenu hesla pre roota v tabu¾ke USER v databáze MYSQL (spomínate si?).Syntaktický zápis príkazu update je:update meno_tabu¾ky set položka = nová_hodnota where podmienkaKeby sme chceli upravi šiesty záznam tabu¾ky ZANER na „faktografia“ namiesto „lit.faktu“, vykonali by sme to príkazom:mysql> update zaner set tematika = ‘faktografia’ where cis_odd=6;alebomysql> update zaner set tematika = ‘faktografia’ where tematika=’lit.faktu’;Jeden aj druhý zápis je správny, záleží len na stanovení podmienky urèujúcej, ktorý záznamsa upraví. Ak podmienke vyhovie viac záznamov, dôjde k zmene pri všetkých záznamoch,ktoré vyhoveli podmienke. Ak nevyhovie ani jeden záznam z tabu¾ky, ostanetabu¾ka bez zmien.Pre našu ïalšiu èinnos si naplòte aj druhú tabu¾ku KNIHA aspoò nieko¾kými záznamami,aby sme sa nabudúce mohli pohra s mnohými variantmi príkazu SELECT. Tuuvidíme silu SQL.Aby sme si precvièili to, èo sme si dnes vysvetlili, ale zároveò nepoškodili nevhodnýmzásahom prácne vytvorené databázové základy budúceho projektu knižnice, vypracujemesi cviène domácu úlohu!Domáca úloha:1) Vytvorte si cviènú databázu SKUSKA2) V nej vytvorte tabu¾ku OSOBY, ktorá bude obsahova tieto ståpce a ich typy:por_cisloint auto_increment primary keymenovarchar(30)3) Naplòte tabu¾ku vhodnými dátami (môžete vyskúša aj zadávanie a zobrazovanieznakov s diakritikou)4) Vypíšte obsah tabu¾ky5) Zmažte nieko¾ko záznamov pod¾a vami stanovenej podmienky6) Vložte jeden nový záznam(Èo zaujímavé ste zistili???)7) Zmeòte ¾ubovo¾ný záznam príkazom update a prezrite si výsledok8) Èo sa stane, ak zadáte neúplný príkaz:delete from osoby9) Zrušte tabu¾ku OSOBY10) Zrušte databázu SKUSKA (mysqladmin drop...)n Miroslav OravecMazanie záznamuNa výmaz konkrétneho záznamu v urèitej tabu¾ke sa používa príkaz:delete from meno_tabu¾ky where podmienkaPodmienka nasledujúca za slovom WHERE urèuje, ktorý záznam bude zmazaný. Ak anijeden záznam nespåòa podmienku, nijaká zmena sa nevykoná. Keby sme teda chcelivymaza štvrtý riadok z tabu¾ky ZANER, príkaz by vyzeral asi takto:mysql> delete from zaner where cis_odd = 4;12/2000 PC REVUE 129

P R O G R A M U J E M EProgramovanie v PHP / 3. èas : PHP a FilesystemVítam vás už pri tretej èasti nášho seriálu, ktorý má za úlohu nauèi vás programovav PHP, teda v jazyku, ktorý má vo svete dynamicky generovaných stránok èoraz väèšiupodporu a ob¾ubu. Po tom, èo sme si osvojili základy syntaxe jazyka, znaène podobnéhojazyku C, ako sú typy premenných, kontrolné štruktúry, vetvenia a cykly, všetko z oblastizväèša všeobecných èàt jazyka, prejdeme teraz na nieèo trošku konkrétnejšie. Èaká na násfilesystem èiže po slovensky súborový systém. Ide o problematiku znaène citlivú hlavne nabezpeènos vzh¾adom na to, že nie každý programátor musí by skúseným správcomservera a pri práci so súbormi môže urobi nieèo, èo môže ma neblahý dosah na behcelého servera. Preto hneï na zaèiatku upozoròujem, že si treba dáva pozor na to, kdea s akými súbormi pracujete. Ak totiž v PHP pracujete a máte svoje skripty na freehostingovýchserveroch, ako napríklad www.miesto.sk, musíte nastavova práva súborov cez FTPklienta, prièom ich väèšinou budete nastavova na rwe-rwe-rwe (teda všetky práva prevšetkých používate¾ov – read, write, execute). To isté platí aj pre adresáre. Keby niekto zistil,že u seba takýto súbor alebo adresár máte, mohol by vám vyvies najrôznejšie zákernosti.Najlepším spôsobom, ako to obís , je vytvori taký adresár, ktorého majite¾om budeiba server a iba ten bude ma právo zápisu, èítania a vykonávania (exekúcie) v tomtoadresári. V òom by ste si potom mohli robi , èo chcete, zapisova i èíta . Problémom je,že nejde o jednoduchú vec a na freehostingových serveroch sa takýchto možnostínedoèkáte. Neostáva vám teda niè iné ako rozumne navrhnú program a rozhodi dátovésúbory do iných adresárov, ako sú spustite¾né skripty, a tým aspoò èiastoène programzabezpeèi . Vïaka týmto problémom je filesystem v internetových diskusných fórachèasto vïaènou témou. Poïme sa však už konkrétne pozrie na ten v PHP.Základné funkcieZákladnými funkciami filesystemu môžeme nazva funkcie na otváranie a zatváraniesúborov. Ide o funkcie fopen() a fclose(). Asi ste už usúdili, že prvá funkcia budeslúži na otvorenie súboru. Vracia premennú typu file pointer (teda nieèo ako ukazovate¾súboru), ktorá má význam pri pohybe po súbore. Má tri parametre, prièom ten tretí jenepovinný a skoro sa nepoužíva. Preto sa budeme venova tým prvým dvom. Prvým parametromje re azec obsahujúci meno súboru, ktorý chcete otvori . Ak sa tento re azec zaèína“http://”, otvorí sa HTTP pripojenie na špecifikovaný server. Takisto môžete zadávamená súborov na FTP, takže pripojenie na FTP je realizované v prípade, že meno súborusa zaèína na “ftp://”. Ak sa re azec zaèína èímko¾vek iným, súbor je otvorený z lokálnehofilesystemu. Druhým parametrom je takisto re azec, v ktorom je identifikátor módu, akýmbudete pristupova k súboru. Ten môže by jeden z nasledujúcich:r – otvorí súbor iba na èítanie, ukazovate¾ je nastavený na zaèiatok súborur+ – otvorí súbor na èítanie a na zápis, ukazovate¾ je nastavený na zaèiatok súboruw – otvorí súbor iba na zápis, ukazovate¾ je nastavený na zaèiatok súboru a dåžkasúboru je skrátená na nulu (teda všetko zo súboru je zmazané). Ak súborneexistuje, pokúsi sa ho vytvoriw+ – otvorí súbor na zápis i èítanie, ukazovate¾ je nastavený na zaèiatok súboru a dåžkasúboru je skrátená na nulu. Ak súbor neexistuje, pokúsi sa ho vytvoria – otvorí súbor iba na zápis, ukazovate¾ je nastavený na koniec súboru. Ak súborneexistuje, pokúsi sa ho vytvoria+ – otvorí súbor na èítanie i zápis, ukazovate¾ je nastavený na koniec súboru. Ak súborneexistuje, pokúsi sa ho vytvoriAko som už písal, funkcia vracia ukazovate¾ daného súboru. Aby sme ho potom mohlipoužíva , musíme túto návratovú hodnotu priradi nejakej premennej. Táto premennánám potom poslúži pri práci so súbormi pri ostatných funkciách. Teraz malá ukážkaotvárania súborov:$subor = fopen(“data/meno.dat”,”r”); //otvorí súbor meno.dat vadresári data pre èítanie$subor = fopen(“info.dat”,”w+”); //otvorí súbor info.dat prezápis i èítanie, zmaže všetko, èo v òom je, ak neexistuje, skúsi hovytvori$subor = fopen(“ftp://login:heslo@server.sk”,”w”); //otvorí súborna FTPFunkcia fclose() má jediný parameter, a to už spomínaný ukazovate¾ súboru, teda filepointer. Táto funkcia nerobí niè iné, iba zatvorí súbor, ktorému je priradený príslušný ukazovate¾,zadaný ako parameter tejto funkcie. Funkcia vracia hodnoty true alebo false vzávislosti od toho, èi prebehlo zatváranie súboru úspešne alebo nie. Ako príklad siuvedieme zatvorenie súboru otvoreného v predchádzajúcom príklade:fclose($subor);Ïalšie funkcie na prácu s filesystemomTakže tie dve základné funkcie máme za sebou, ale iste uznáte, že to nám zatia¾ prílišnepomôže. Preto si teraz ukážeme ïalšie, ktoré nám umožnia plnohodnotne pracovaso súbormi.Tou prvou, o ktorej si povieme, je funkcia fgets(). Táto funkcia slúži na preèítanieriadka zo súboru. To, èo zo súboru preèíta, je interpretované ako návratová hodnotatypu re azec, takže výsledok tejto funkcie by bolo vhodné priradi nejakej premennej.Funkcia má dva parametre, prièom oba sú povinné. Prvým je file pointer súboru, zktorého chceme èíta (z èoho vyplýva, že pred použitím funkcie musíme súbor otvori ).Druhý parameter špecifikuje poèet bajtov (znakov), ktorý má by preèítaný zo súboru(prièom je preèítaný vždy poèet znakov o 1 nižší, než je zadané týmto parametrom,teda ak zadáme 100, bude preèítaných iba 99 znakov). Znaky však budú èítané iba najednom riadku, pretože èítanie sa môže konèi nielen dosiahnutím dåžky zadanejdruhým parametrom, ale aj dosiahnutím príznaku konca riadka alebo konca súboru. Toznamená, že ak prikážeme preèíta väèší poèet znakov, ako sa nachádza v riadku, budepreèítaný nižší poèet znakov, resp. budú preèítané iba znaky nachádzajúce sa v riadku,po prechode na nový riadok sa èítanie konèí. Tu je malá ukážka použitia funkciefgets():$subor = fopen(“text.txt”,”r”); //otvorenie súboru na èítanie$text = fgets($subor,1000); //preèíta 999 znakov, prípadne celýriadok zo súboru text.txt do premennej $textfclose($subor); //zatvorí súbor text.txtV prípade, že budete chcie zo súboru naèíta iba jeden znak, môžete použi funkciufgetc(). Tá má iba jeden parameter, ktorým je file pointer súboru, z ktorého chceteèíta . Návratovou hodnotou je jeden znak naèítaný zo súboru, ktorý je identifikovanýtýmto file pointerom. V prípade, že ukazovate¾ je už na konci súboru (príznak EOF), návratováhodnota je FALSE.Ïalšou funkciou, o ktorej si povieme, je fputs(). Pod¾a mena ste už možno usúdili,že pôjde o funkciu, ktorá zapíše re azec do súboru. Táto funkcia má tri parametre, prièomprvý je už známy file pointer. Druhým parametrom je re azec alebo premenná typure azec, ktorej obsah chceme zapísa do súboru. Tretí parameter je nepovinný a špecifikujepoèet znakov, ktorý má by do súboru zapísaný. Ak tento parameter neuvedieme,zapíše sa celý re azec. Samozrejme, platí, že ak bude špecifikovaný poèet znakov väèší akodåžka samotného re azca, bude zapísaných iba to¾ko znakov, ko¾ko ich re azec skutoèneobsahuje. Ukážka použitia funkcie:$text = “Ahoj, ako sa máte?\n”;$subor = fopen(“text.txt”,”w”); //otvorenie súboru na zápis,skrátenie na nulovú dåžkufputs($subor,$text); //zapíše re azec v premennej $text do súborutext.txtfclose($subor); //zatvorí súbor text.txtMožno sa niekto môže zaèudova tomu, že re azec $text je ukonèený sekvenciou “\n”. Ktovšak pozorne èítal predchádzajúce èasti, iste vie, že ide o escape sekvenciu, ktorá znamenáukonèenie riadka a prechod na nový (newline).Teraz sa budeme venova ïalšej funkcii z filesystemu PHP, konkrétne je to funkciafile_exists(). Táto funkcia nachádza pomerne èasté využitie, pretože slúži na overenieskutoènosti, že daný súbor existuje. Preto ak chcete z nejakého súboru èíta , mali byste použi najprv túto funkciu, aby ste mali istotu, že vám program nespadne pre pokusèíta z neexistujúceho súboru. Každý dobrý programátor by sa mal snaži ošetrisvoje programy pred pádom pre chybu pri vstupe. Poïme však naspä k funkciifile_exists(). Tá má jediný parameter, ktorým je re azec obsahujúci meno súboru.Z logických dôvodov sa tu už nepoužíva náš starý známy file pointer, pretože testova , èiexistuje súbor, ktorý máme otvorený, je nezmyselné. Takže najprv test pomocoufile_exists() a až potom otvorenie pomocou fopen(). Funkcia vracia true vtedy, aksúbor existuje, v opaènom prípade false. Preto otváranie súboru text.txt v adresári docsby malo prebieha asi takto:if (file_exists(“docs/text.txt”)) {$subor = fopen(“docs/text.txt”,”r”);..práca so súborom.fclose($subor);}else {echo “Bohužia¾, súbor docs/text.txt neexistuje.”;}Takto ošetrený súbor nebude ma vo výstupe nijaké chyby èi varovania od interpretera.Treba však pripomenú , že výsledky tejto funkcie sú ukladané do tzv. cache, èo jepamä , z ktorej sa „vyberajú“ výsledky pri ïalšom volaní tejto funkcie. Preto vrátená130 PC REVUE 12/2000

P R O G R A M U J E M EZadáme teda:mysql> insert into zaner values (0, ‘poezia’);Preèo sme <strong>na</strong> prvú pozíciu zadali nulu?Keï sme tvorili tabu¾ku ZANER, urèili sme, že ståpec CIS_ODD bude ma autoinkrementaènúschopnos . Preto nie je potrebné zada do ståpca CIS_ODD príslušné poradové èíslo,<strong>na</strong>pr. 1,2,3... Ak zadáme v každom pridaní záz<strong>na</strong>mu pomocou insert into nulu, serversám za nás priradí prvé vo¾né poradové èíslo. Keï zadávame pridanie ïalších záz<strong>na</strong>mov,znova <strong>na</strong> prvú pozíciu zapíšeme nulu, teda:mysql> insert into zaner values (0, ‘roman’);Pripomí<strong>na</strong>m, že re azce sa zadávajú do apostrofov alebo do úvodzoviek. Keïže niektoréoperaèné systémy neuznávajú v textoch úvodzovky, my budeme používa univerzálnejšíapostrof.(Poznámka: Možno nás <strong>na</strong>padne, èi môžeme zadáva textové re azce s diakritikou.Odpoveï je trochu komplikovaná. Ak prostredie operaèného systému umožòuje písaa zobrazova z<strong>na</strong>ky s diakritikou <strong>na</strong> obrazovke, môžeme túto možnos využi . Ale aknemáme MySQL server preložený s podporou triedenia pod¾a národnej abecedy,Obr. 3dostaneme v príkaze SELECT niekedy nežiaducu odpoveï. Ako mi je známe, prekladsamotného servera je možný iba v prostredí Linux, zatia¾ èo binárne súbory pre Windowsnie sú <strong>sk</strong>ompilované s národnou podporou. Nie je to neriešite¾né, ale zatia¾ v týchtocvièných aplikáciách budeme používa texty bez diakritických z<strong>na</strong>mienok.)Ak sme nespravili žiadnu chybu, SQL server potvrdí vyko<strong>na</strong>nie príkazu hlásením:Query OK, 1 row affected (0.22 sec)èo z<strong>na</strong>mená asi to¾ko, že query – dopyt – bol správny, bol ovplyvnený jeden riadoka ko¾ko èasu trvalo vyko<strong>na</strong>nie tohto query. Takto doplníme aj ostatné záz<strong>na</strong>my do tabu¾kyZANER:mysql> insert into zaner values (0, ‘krimi’);mysql> insert into zaner values (0, ‘det<strong>sk</strong>a lit.’);mysql> insert into zaner values (0, ‘cestopis’);mysql> insert into zaner values (0, ‘lit. faktu’);mysql> insert into zaner values (0, ‘odbor<strong>na</strong> lit.’);Všimnime si, že sme nulu použili aj v ostatných zápisoch.Vyh¾adávanie záz<strong>na</strong>movAko sa presvedèíme, aké dáta máme uložené v tabu¾ke?Na to použijeme príkaz SELECT.Vieme, že úlohou príkazu SELECT je vybra z danej tabu¾ky urèité informácie <strong>na</strong> základestanovených kritérií. Je to jeden z <strong>na</strong>jmocnejších príkazov v SQL štruktúre. Jeho mnohýmparametrom sa budeme postupne venova , zatia¾ nám staèí vedie <strong>na</strong>jjednoduchší azároveò <strong>na</strong>jvšeobecnejší zápis:mysql> select * from meno_tabu¾ky;Select z<strong>na</strong>mená výber, * z<strong>na</strong>mená všetko, from odkia¾ a za meno_tabu¾ky dosadíme užkonkrétne meno. V <strong>na</strong>šom prípade príkaz select * from zaner z<strong>na</strong>mená: vyber všetko ztabu¾ky ZANER a výsledok bude vyzera tak ako <strong>na</strong> obrázku è. 4.Obr. 4V prípade, že by sme rozhodovali pod¾a textového po¾a TEMATIKA, podmienka by vyzeralatakto:mysql> delete from zaner where tematika = ‘det<strong>sk</strong>a lit.’;Zme<strong>na</strong> záz<strong>na</strong>muNa zmenu obsahu urèitého záz<strong>na</strong>mu sa používa príkaz UPDATE. Ten sme už raz použili,a to <strong>na</strong> zmenu hesla pre roota v tabu¾ke USER v databáze MYSQL (spomí<strong>na</strong>te si?).Syntaktický zápis príkazu update je:update meno_tabu¾ky set položka = nová_hodnota where podmienkaKeby sme chceli upravi šiesty záz<strong>na</strong>m tabu¾ky ZANER <strong>na</strong> „faktografia“ <strong>na</strong>miesto „lit.faktu“, vyko<strong>na</strong>li by sme to príkazom:mysql> update zaner set tematika = ‘faktografia’ where cis_odd=6;alebomysql> update zaner set tematika = ‘faktografia’ where tematika=’lit.faktu’;Jeden aj druhý zápis je správny, záleží len <strong>na</strong> stanovení podmienky urèujúcej, ktorý záz<strong>na</strong>msa upraví. Ak podmienke vyhovie viac záz<strong>na</strong>mov, dôjde k zmene pri všetkých záz<strong>na</strong>moch,ktoré vyhoveli podmienke. Ak nevyhovie ani jeden záz<strong>na</strong>m z tabu¾ky, ostanetabu¾ka bez zmien.Pre <strong>na</strong>šu ïalšiu èinnos si <strong>na</strong>plòte aj druhú tabu¾ku KNIHA aspoò nieko¾kými záz<strong>na</strong>mami,aby sme sa <strong>na</strong>budúce mohli pohra s mnohými variantmi príkazu SELECT. Tuuvidíme silu SQL.Aby sme si precvièili to, èo sme si dnes vysvetlili, ale zároveò nepoškodili nevhodnýmzásahom prácne vytvorené databázové základy budúceho projektu knižnice, vypracujemesi cviène domácu úlohu!Domáca úloha:1) Vytvorte si cviènú databázu SKUSKA2) V nej vytvorte tabu¾ku OSOBY, ktorá bude obsahova tieto ståpce a ich typy:por_cisloint auto_increment primary keymenovarchar(30)3) Naplòte tabu¾ku vhodnými dátami (môžete vy<strong>sk</strong>úša aj zadávanie a zobrazovaniez<strong>na</strong>kov s diakritikou)4) Vypíšte obsah tabu¾ky5) Zmažte nieko¾ko záz<strong>na</strong>mov pod¾a vami stanovenej podmienky6) Vložte jeden nový záz<strong>na</strong>m(Èo zaujímavé ste zistili???)7) Zmeòte ¾ubovo¾ný záz<strong>na</strong>m príkazom update a prezrite si výsledok8) Èo sa stane, ak zadáte neúplný príkaz:delete from osoby9) Zrušte tabu¾ku OSOBY10) Zrušte databázu SKUSKA (mysqladmin drop...)n Miroslav OravecMazanie záz<strong>na</strong>muNa výmaz konkrétneho záz<strong>na</strong>mu v urèitej tabu¾ke sa používa príkaz:delete from meno_tabu¾ky where podmienkaPodmienka <strong>na</strong>sledujúca za slovom WHERE urèuje, ktorý záz<strong>na</strong>m bude zmazaný. Ak anijeden záz<strong>na</strong>m nespåòa podmienku, nijaká zme<strong>na</strong> sa nevykoná. Keby sme teda chcelivymaza štvrtý riadok z tabu¾ky ZANER, príkaz by vyzeral asi takto:mysql> delete from zaner where cis_odd = 4;12/2000 PC REVUE 129

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!