Sissejuhatus Veeb tänapäevasel kujul asus jõudsalt levima 1990ndate aastate keskel. Suurelt jaolt kasutati seda küll staatiliste tekstide ja piltide mugavaks välja näitamiseks, kuid juba algusest peale olid kasutusel juures lisad, mis võimaldasid lehe sisu vastavalt kasutajale või tema tegevusele eraldi näidata. Levinumate näitena selle kohta kehtiva kuupäeva näitamine või otsing soovitud andmete alusel. Sellisel juhul ei piisa paljast valmistehtud lehe kopeerimisest kasutajale, vaid tuleb lehe sisu tekitada või ühendada mõne programmi võimaluste abil. Vahendeid selleks on aegade jooksul olnud mitmesuguseid. Siiani kasutusel on võimalus käivitada suvalises meeldivas keeles koostatud programm veebiserveris ning lasta sel suhelda brauserist tulnud päringuga vastava liidese (CGI – Common Gateway Interface) abil. Keskkonnamuutujate kaudu saadakse kätte edastatavad andmed (näiteks otsisõna) ning programmi trükitav väljund suunatakse brauseri poole teele – tehniliselt nõnda lihtne see ongi. Iga programmeerija võis endiselt kirjutada omale sobivas keeles ning kõik toimis. Veebisisendi ja -väljundiga programmidel on aga mõned eripärad. Olenevalt rakendusest, kuid küllalt sageli tuleb väljastada suures koguses muutumatut HTML-teksti ning sinna vahele vaid üksikud kohad, mis programmiga muuta vaja. Teiseks probleemiks veebirakenduste juures on, et kunagi ei saa usaldada sisendit kasutajalt – üle veebi võib tulla ligi suvaline häkker ning otsisõna asemele panna teele näiteks mõne videofilmi sisu binaarkujul. Sekelduste vältimiseks on seetõttu kasulik lisada sisendile piiranguid ja kontrolle. Veebi leviku laienedes lisandus ka raamistikke, keeli ja keeletäiendusi, mille abil peaks veebiprogramme olema mugavam kokku panna kui ”tavaliste” programmeerimiskeelte abil. Suure veebileviku osaliseks sai keel nimega PERL, millel võrrelduna näiteks tol ajal muidu väga levinud C-ga olid tunduvalt mugavamad ja mitmekülgsemad vahendid tekstidega ümber käimiseks. Tuntumad eraldi veebi jaoks loodud vahendid ehk ASP (nüüdseks põhjalikult muudetuna ASP.NET), Zope, Java Servletid ja JSPd. Lihtsamate ja ka keskmiselt keerukate veebilehestike juures sai valitsevaks keeleks PHP. PHP tutvustus Algselt ühe koolipoisi katsetustest levima hakanud kodulehe koostamise abivahend (Personal Home Page) sai oma lihtsuse ja vabade kasutusõiguste tõttu üllatavalt populaarseks. Eks lihtsusega käivad koos ka mõned ohud, mida on uuemates versioonides püütud lappida. Kuid võlu, et kõik kohe arusaadav ja kasutatav on, paneb paljudki programmeerijad heal meelel PHPst alustama. Päris algus PHP-leht on tavaline teksti (või siis üldjuhul HTML-leht), kus sobivate märkide vahel saab programmikoodi käima lükata – nõnda nagu enamiku muudegi veebiprogrammeerimissüsteemide puhul. Lihtsaim demo näeb välja järgmine: PHP-võimelise veebiserveri kaudu välja kuvatavasse kataloogi tuleb paigutada järgneva sisuga fail. Laiendiks php – näiteks nimega algus.php Kui nüüd leht veebilehitsejas avada, võiks seal ilutseda üks ilus suur number 5. Kolm ja kaks liideti kokku. Väike seletus ka juurde: . Ning vahepealne 3+2 lihtsalt arvutatigi kokku ja trükiti välja. Kui lehel alguses või lõpus oleks veel muudki teksti, trükitaks ka see välja. Ülesandeid * Hangi või tee selgeks enesele võimalus PHP-võimelises veebiserveris veebilehtede loomiseks. * Koosta tervitav leht ja vaata seda veebiserveri kaudu * Muuda lehe sisu ning uuendusnupu vajutuse järel veendu muutuse kajastumises ka veebilehitsejas. * Käivita konspektis olnud näide kahe arvu liitmise kohta. * Muuda arve ja tehet, kontrolli tulemusi. Muutuja, valik ja kordus Järgnevalt juba veidi pikem koodilõik. Kui ei piirduta vaid ühe arvu või lause väljastusega, siis tuleb ploki alguseks märkida -ga tähistatud ploki lõpuni rahulikult programmikoodi kirjutada -.see pannakse käima ning tulemus saadetakse veebilehistsejasse. Programmeerimiskeeltes on levinud võimalus andmeid muutuja ehk märksõna alla meelde jätta. PHPs algavad muutujate nimed dollarimärgiga. See võimaldab neid hiljem vabamalt teksti sisse panna. Lõik $eesnimi="Juku"; echo "Tere, $eesnimi!"; trükib aimatavalt välja ”Tere, Juku”. Valiku jaoks on käsklus if. Tingimus pannakse ümarsulgude sisse. Kui tingimus vastab tõele (praegusel juhul vanus on väiksem kui seitse), siis täidetakse järgnevate looksulgude vahele paigutatud plokk. $vanus=5; if($vanus<7){ echo "Oled noor!"; } Korduse ehk silmuse ehk tsükli puhul võidakse looksulgude vahele kirjutatud toimetus ette võtta korduvalt. Järgnev näide teatab viis korda Kuku! for($i=0; $i<5; $i++){ echo "Kuku!"; } Seletus ka juurde. Muutuja $i (PHPs algavad kõik muutujad dollarimärgiga) aitab meeles pidada, mitmenda korra juures ollakse. Käsu for ümarsulgude sees on kolm semikoolonitega eraldatud tsooni. Esimeses neist on algväärtustus, täidetakse üks kord, kohe for-ini jõudmise juures. Tüüpiliselt antakse siin loendurile algväärtus, praegusel juhul i-le 0. Keskmises tsoonis kontrollitakse tingimuse kaudu, et kas on põhjust for-ile järgnevate looksulgude vahel olevaid käske täitma hakata. Kui tingimus on tõene siis jah, muidu mitte. Võib ka juhtuda, et tingimus on juba esimesel korral väär - sellisel juhul ei täideta tsükli keha ühtegi korda. Viimasesse ehk kolmandasse tsooni paigutatakse tsüklis edasiliikumise tegevus(ed) - siin juhul suurendatakse $i väärtust, et järgmisel korral oleks juba suurem arv loenduriga võrrelda. Lugemisega alustatakse tüüpiliselt nullist - siis hiljem massivide puhul kergem toimetada. Koodilõigu loodud väljund järgmine: Ülesandeid * Käivita nähtud näide, muuda andmeid, jälgi tulemusi * Lisa tervitatavale inimesele perekonnanimi eraldi muutujasse, trüki ka selle väärtus. * Lisa tingimus üle saja-aastaste jaoks teatega "oled hirmus vana". * Lisa for-tsükli sisse iga Kuku järjekorranumber. PHP HTMLi sees Nagu näha, võib PHP ka lihtsat teksti väljastada. Kui aga tahta kokku panna viisaka kujundusega veebilehte kus ka kasutaja midagi sisestada saab, siis tuleb HTMLi reeglitega arvestama hakata. Viisakasti tasub , tema sees peamiste suurte plokkidena ja . Esimesse neist tulevad enamikus metaandmed ehk siis andmed dokumendi kohta, sisse nähtav tekst ise. Lihtsaim asjalik lõik PHPd HTML koodi sees võiks välja näha ehk järgmine: Nagu aimata võite, võib selle tulemusena näha veebiserveri kella aega veebilehel kliendi masinas. Tekst "Kell on " tuleb välja jutumärkide vahelt. Järgnev punkt on operaator tekstide liitmiseks (sidurdamiseks). Ning käsklus date võimaldab kuupäeva ja kellaaja väljastada ettemääratud kujul. Siin näites kasutatud H tähendab tunde 24 tunni süsteemis, i minuteid (sest m ehk month on kuude jaoks) ning s sekundeid. Koolonid trükitakse nende vahele niisama välja. Leht tervikuna siis: PHP katsetused

PHP katsetused

Sisestusega veebileht Lehele sisestuselementide lisamiseks on sinna kõigepealt vaja panna kujunduse mõttes nähtamatu plokk nimega form. Parameeter action näitab, millisele lehele saadetakse elementidesse kirjutatud andmed. Praeguses näites on fail ise nimega "teine.php" ning action saadab andmed ka faili "teine.php" ehk siis failile iseenesele. Kui andmed kirjutatakse väljadesse ja vajutatakse submit- nuppu, siis pannakse nad praegusel juhul kaasa avatava faili aadressiribale -
Eesnimi: Vanus:
Järgmisel avamisel võib näha aadressiribal failinime näiteks kujul teine.php?eesnimi=Juku&vanus=7 Järgmine samm on vormi kaudu aadressiribale jõudnud andmed kätte saada ning nendega midagi ette võtta. Andmete püüdmiseks sobib massiiv nimega $_REQUEST (teadjamatele: sinna jõuavad kokku andmed massiividest $_GET ja $_POST). Sisestatud tegelase lihtsaks tervitamiseks sobib rida echo "Tere, $_REQUEST[eesnimi]"; Selle juures on aga probleemiks, et tervitada püütakse ka juhul, kui nime andmeid tegelikult ei ole. Sel juhul ilmuks ekraanile paljas tere koos komaga. Kui me pole kindlad, kas andmed saabuvad või mitte, siis on viisakas nende olemasolu enne kasutamist kontrollida. Kusjuures on kaks täiesti erinevat andmete puudumise juhtu. Ühel puhul lihtsalt leht avati niisama, sisestades aadress aadressiribale. Teine puudumise puhk on juhul, kui lehele küll sisenetakse vormi kaudu andmeid sisestades ja submit-nupule vajutades, kuid tekstivälja väärtus jäeti tühjaks. Aadressiriba tekib siis kujul näiteks teine.php?eesnimi=&vanus=7 Elemendi olemasolu kontrollib PHPs funktsioon nimega isSet, väljastades tõeväärtuse true/false. Näiteks if(isSet($_REQUEST["eesnimi"])){...} Sisestatud teksti olemasoluks on aga hea moodus kindlaks teha selle teksti pikkus käsuga strlen. Kui tekst juhtub tühi olema, siis lihtsalt on selle pikkus 0. Nõnda saabki kokku koodilõigu, mis esimesel avamisel ei ütle midagi. Nimelahtri tühjaksjätmisel aga teatab nime puudumisest. if(isSet($_REQUEST["eesnimi"])){ if(strlen($_REQUEST["eesnimi"])>0){ echo "Tere, $_REQUEST[eesnimi]!"; } else { echo "Nimi kirjutamata!"; } } Eks arvude puhul saab olemasolu samamoodi kontrollida. Esialgu on ka vanus arvuti jaoks lihtsalt tekst ehk sümbolid. Seepärast ka sisestuslahter sai kirja Vanus: Kui tahta kontrollida, et sinna lahtrisse saaks kirjutada vaid numbreid, siis tuleks selleks eraldi Javaskripti lõik kirjutada või mõne raamistiku abil sisse panna. Kui serveris aga tahta saabunud arvuga viisakalt ümber käima hakata, siis on viisakas saabunud tekst mälus arvulisele kujule ümber muundada. Täisarvude puhul aitab seda teha funktsioon nimega intval. Edasi võib veebist tulnud arvuga käituda juba sarnaselt nagu iga muu arvuga. Siin siis tervitame nime sisestanut nõnda palju kordi, palju tal aastaid on. if(strlen($_REQUEST["vanus"])>0){ $v=intval($_REQUEST["vanus"]); for($i=0; $i<$v; $i++){ echo "Õnne! "; } } Veebisisestuse üle ei saa aga kunagi kindel olla: kui juhtub, et mõni katsetaja kirjutab oma vanuseks miljoni, siis see koodijupp tervitab teda rõõmsalt miljon korda, kulutades vastavalt serveri aega. Selline tegevus pole küll serveri andmetele ohtlik, kuid kui häkkerid tahaksid hakata masinat kõvasti koormama, siis paarikümnest kohast pidevalt end miljoni kaupa tervitada laskmine on hea moodus serveri kiusamiseks. Kõike selliseid võimalusi ei jõua ega saagi kinni panna. Aga mõnigikord peab mõtlema, et kas, mida ja kui palju on põhjust turvata, ehk siis kiusajatele takistusi teha. Nime ja vanuse järgi tervitav ja õnnitlev leht siis järgmine. failinimi: teine.php PHP katsetused

PHP katsetused

0){ echo "Tere, $_REQUEST[eesnimi]! "; } else { echo "Nimi kirjutamata! "; } } echo "Kell on: ".date("H:i:s"); ?>
0){ $v=intval($_REQUEST["vanus"]); for($i=0; $i<$v; $i++){ echo "Õnne! "; } } ?>
Eesnimi: Vanus:
Kõigepealt avades teatatakse vaid kellaaeg ja antakse ette sisestuskastid. Sinna kannatab andmed sisse kirjutada. Edasi jõuavad need andmed aadressiriba kaudu faili juurde kuhu form-i action suunab. Ning selle lehe ülesandeks on juba saabunud andmetele vastav sisu kuvada. Ülesandeid * Lase kasutajal sisestada kaks arvu. Programm väljastab nende korrutise * Trüki kasutaja määratud ridade ja veergude arvuga korrutustabel Lehe koostamine alamosadest Aastate eest oli tähtsaks näitajaks serveri või teenusepakkuja juures, et kas too toetab SSI-d ehk Server Side Include't. Nüüd saab sama tulemuse PHP käskudega mugavasti kätte. Paljude sarnase kujundusega lehtede juures on paratamatult hulk korduvat koodi - soovitakse samasse kohta paigutada logo, menüü ja ehk muudki. Üheks võimaluseks on algul blanketileht teha, seal tähtsamad kujunduseasjad ära määrata ning seejärel blanketist sobiv hulk koopiaid teha. Kui lehestik nõnda ühekordselt kokku pannakse, siis selline lähenemine täiesti sobib. Samuti aitavad mõned keskkonnad (nt. FrontPage) selliseid sarnaseid lehti genereerida. Kui aga tehakse lehti lihtsa HTML-redaktoriga, samuti kui tahetakse lehe koodi ise kontrollida ning sinna hiljem programmilõikegi sisse panna, sellisel juhul on sisseloetavad alamosad igati head abilised. Näitena koostame bussiliinide andmeid avaldava lehestiku, kus muutuvad ainult liini andmed. Lehe päis, jalus ja menüü jäävad ikka samadesse kohtadesse. Alamosad loetakse sisse järgneval joonisel näha olevatest failidest: Päiseosa saab failist p2is.php. Sinna tuleb kogu HTMLi algusots: DOCTYPE, head ja title ning lehe keha algus. p2is.php Bussiliinid Samuti loetakse sinna juurde sisse menüü failist menyy.php. menyy.php

Menüü

Menüü on hea eraldi kohas hoida. Siis on sinna mugav lisada uusi ning eemaldada vanu lehekülgi. Samuti võib hiljem vajadusel paigutada menüükihi lehe koodis mõnda muusse, hetkel sobivamasse kohta. Ka kujundus on paigutatud eraldi faili. Ehkki siinse sisselugemise teel saaks kujunduseosa suhteliselt mugavalt panna ka päisefaili, on vähegi pikema kujunduslõigu puhul see mõttekas panna omaette faili. Päisefaili kaudu lugedes arvatakse see kujunduslõik iga kord eraldi faili osaks olema ning sikutatakse kogupikkuses serverist kohale. Kui aga viidatakse eraldi css-failile, siis piisab selle ühe korra kohale tõmbamisest, ülejäänud osa ajast saab puhvris olevaid andmeid kasutada. Kujundusefailis määratakse ära lehel asuvate plokkide asukohad. Käsklus float paneb kihi lehe peal "ujuma". Kuna nii menüükihil kui ka sisukihil on omadus float:left, siis nad ujuvad üksteisel sabas. Menüü on nõnda lai, nagu teksti laius teda lükkab, sisukihil on praegu määratud laiuseks 70% akna suurusest, et ta kasvaks ja kahaneks koos aknaga. Lõputeate kihi clear:left ütleb, et tuleb taas uuelt realt oma paiknemist alustada, nii jõuab ta ilusti eelmiste elementide alla. kujundus.css body{ background-color: #ffeb90; } #menyy{ float: left; padding-right: 30px; } #sisu{ width: 70%; float: left; } #loputeade{ clear: left; } Jalus praeguse seisuga lihtne fail, kus lõputeade ning HTML-lehe ots. jalus.php
Lehe koostas Jaagup
Sisuleht Kui abitükid olemas, siis saab asuda sisulehti koostama. Nemad loevad enesele require-käsuga sisse ette päise ja taha jaluse. Päis haarab enese külge veel kaasa menüü. Sisule ka omaette väike kiht paigutamiseks ümber ning võibki rahumeeli vajalikud andmed sinna sisse kirjutada.

726 HAAPSALU-TAEBLA-PALIVERE-RISTI-LAITSE-TALLINN

    
12:00  	   	HAAPSALU
12:05 	  	UUEMÕISA (LÄÄNEMAA)
12:10 	  	RANNAKÜLA
12:15 	  	TAEBLA
12:17 	  	PRIGULDI
12:19 	  	VÕNTKÜLA
12:23 	  	PALIVERE EIK
12:25 	  	PALIVERE
12:30 	  	JAAKNA
12:35 	  	RISTI (LÄÄNEMAA)
12:38 	  	REHEMÄE
12:45 	  	ELLAMAA
12:50 	  	TURBA (HARJUMAA)
12:57 	  	NISSI TEE
13:05 	  	LAITSE TEE
13:06 	  	RUILA TEE
13:12 	  	HARUTEE
13:25 	  	VANA-PÄÄSKÜLA
13:45 	  	TALLINN
Kaks kõrvutist lehte erinevad vaid sisu poolest - siin siis teise bussiliini ajad ja peatused. Päis ning jalus võetakse külge samasugustena. Käsklus require erineb mõnel pool levinumast include-st selle poolest, et require annab otsitava faili puudumisel veateate, include jätab selle lihtsalt näitamata. Tegemise juures vigade vältimiseks on esimene variant kindlam.

Liin 727, HAAPSALU-TAEBLA-PALIVERE-RISTI-TALLINN

    
13:00  	   	HAAPSALU
13:05 	  	UUEMÕISA (LÄÄNEMAA)
13:10 	  	RANNAKÜLA
13:15 	  	TAEBLA
13:17 	  	PRIGULDI
13:19 	  	VÕNTKÜLA
13:23 	  	PALIVERE EIK
13:25 	  	PALIVERE
13:30 	  	JAAKNA
13:35 	  	RISTI (LÄÄNEMAA)
13:38 	  	REHEMÄE
13:45 	  	ELLAMAA
13:50 	  	TURBA (HARJUMAA)
13:57 	  	NISSI TEE
14:12 	  	HARUTEE
14:25 	  	VANA-PÄÄSKÜLA
14:45 	  	TALLINN
Veebilehitsejas tuleb avada sisuleht. Viimane haarab omale ette ja taha vajalikud tükid külge ning võibki rahumeeli sõiduplaani vaadata. Ülesandeid * Tee näited läbi * Lisa kolmanda bussiliini andmed * Koosta sarnasel moel väike lehestik matka korralduse tarbeks: osalejad, varustus, marsruut. Grupiga lehestiku koostamine: Leppige kokku ettevõtmine, mis kõigile kõlbulik ja soovitavalt põnev tundub Mõelge läbi juurdekuuluv, nt. tegevused, ajakava, varustus, osalejad. Visandage paberile lehestiku üldplaan (logo, menüü, viited ...) Koostage ja kujundage üks leht HTMLi ja CSSiga Jagage korduvad lõigud omaette failidesse Looge erineva sisuga lehed, haakige korduvad tükid külge. Andmefailid eraldi kataloogis Kuni kümnekonna harva muudetava faili puhul on eelmine lähenemine mugav küllalt. Andmete lisamist ja eemaldamist saab aga ka mugavamaks teha. Järgnevas näites korraldati nõnda, et liini andmete näitamiseks piisab vaid sobiva nimega faili paigutamisest selle jaoks ette nähtud kataloogi. Ülejäänuga saab PHP-leht juba ise hakkama. Lehe sisu näitamiseks tuli juurde fail liinivaataja.php. Temale antakse aadressiriba kaudu ette näidatava liini number. Liinivaataja haarab ette päise, taha jaluse ning liiniandmete kataloogist keskele sisse etteantud numbriga algava tekstifaili sisu. Eeldatakse, et failinimed on kujul 726.txt, 727.txt jne. Samuti eeldatakse, et faili nimi enne laiendit on number - sissemurdmise vastaseks kaitseks töödeldakse saabunud parameetrit $_REQUEST["liininr"] käsuga intval, mis muudab iga talle antud teksti arvuks. Arvud jäävad ikka pärast .txt-ga liitmist samasuguseks tekstiks. Kui aga parameetriks antakse midagi muud, siis annab intval sellele tulemuseks 0. Nõnda pole karta, et keegi võiks failinime sisse paigutada kataloogide vahel liikumise või muid andmete õngitsemiseks tarvilikke käske. Käsklus file_get_contents tagastab parameetriga ette antud faili sisu. @-märk käsu eel annab teada, et tekkivaid veateateid ei kuvataks ekraanile - need jällegi asjad, mis kipuvad häkkeritele masina ülesehituse kohta teavet andma ning sellest tasub turvalisuse huvides hoiduda. liinivaataja.php

 
Päis endiselt samasugune p2is.php Bussiliinid Menüü skanneerib läbi kõik liiniandmete kaustas leiduvad failinimed. PHP 5st alates kättesaadav funktsioon scandir tagastab etteantud kataloogis leiduvatest failinimedest koosneva massiivi. foreach-tsükliga võetakse sealsed nimed ükshaaval ette, käsklus explode tükeldab failinime punkti koha pealt massiiviks nii, et ühe punkti korral tekib kaheelemendiline massiiv. Kohal 0 on nimi ise ning kohal 1 on laiend. Kontrollitakse üle, et kui faililaiend ikka on .txt, siis lisatakse menüüloetellu vastava faili nimi - pannes see ka ühtlasi viitega kaasa saadetavaks parameetriks. menyy.php

Menüü

kujundus.css body{ background-color: #ffeb90; } #menyy{ float: left; padding-right: 30px; } #sisu{ width: 70%; float: left; } #loputeade{ clear: left; } Jalus endiselt lihtne. jalus.php
Lehe koostas Jaagup
Nüüd piisab liiniandmete faili juures vaid andmetest endist, päist ja muid käsklusi pole lisada enam vaja, need tulevad liinivaataja.php juurest. Ning bussiliinide andmed kindlasti eraldi kausta nimega liiniandmed, siis leitakse need sealt üles: liiniandmed/726.txt 12:00 HAAPSALU 12:05 UUEMÕISA (LÄÄNEMAA) 12:10 RANNAKÜLA 12:15 TAEBLA 12:17 PRIGULDI 12:19 VÕNTKÜLA 12:23 PALIVERE EIK 12:25 PALIVERE 12:30 JAAKNA 12:35 RISTI (LÄÄNEMAA) 12:38 REHEMÄE 12:45 ELLAMAA 12:50 TURBA (HARJUMAA) 12:57 NISSI TEE 13:05 LAITSE TEE 13:06 RUILA TEE 13:12 HARUTEE 13:25 VANA-PÄÄSKÜLA 13:45 TALLINN Ja jällegi võib ilusti omale sobivad sõiduajad valida :-) Ülesandeid * Tee näited läbi * Koosta sarnaselt laulusõnade lehestik: iga laul omaette lehel. Lihtsamal juhul on laulul pealkirjaks number. Keerukamal juhul on failinimi vabam, aga tasub kontrollida, et erisümboleid sisse ei jääks. * Koosta eelmise näite abil pildigalerii. Kataloogis olevaid pilte saab veebi kaudu vaadata. * Jaga galerii alateemadeks, ehk siis alamkataloogideks. Koosta navigeerimisvahendid lehtede vahel liikumiseks.