ITV0110 4. töö 2011
Sisukord
See on 2011 aasta arhiveeritud ülesanne, 2012 aasta ülesande sisu on veidi teistsugune
Andmebaasi kasutajanimi, parool ja näiteid
Kõik need leiad hiljuti uuendatud näidete seast Vorgurakendused 1 SQL naited loengust. Samuti on "Abi ja soovitusi" peatüki alguses uusi näpunäiteid ja ideid.
Mis tuleb teha
Neljanda praktikumi ülesandeks on ehitada mini-reddit, kasutades selleks PHP-d ja MySQL-i (või Postgresqli).
Arusaadavalt on sinu loodav süsteem väga palju lihtsam, kui päris reddit, kuid baasfunktsionaalsus on tal sama.
Kui sa juhtumisi ei ole Redditi kasutaja, siis tee endale konto, upvote/downvote, lisa mõni link ja kommentaar ja tutvu süsteemiga: see ei ole praksi jaoks hädavajalik, kuid tuleb kasuks.
Praktikumi arvestamine ja hindamine
Praktikum annab maksimaalselt 15 punkti.
Edukaks arvestuseks pead realiseerima baasfunktsionaalsuse lihtsamad osad:
- Lingi lisamine.
- Lisatud linkide sorteeritud vaatamine: paremad eespool, kuvatakse korraga piiratud arv. "Parem" on lihtsamal juhul selline, millel upvotes-downvotes skoor on suurem.
- Lingi upvote ja downvote.
- Lingile kommentaari lisamine (ühel lingil võib neid olla kuipalju tahes), salvestatakse lameda listina ilma vastuste hierarhiata.
- Lingi kommentaaride vaatamine lisamisaja järgi sorteeritult, jällegi lameda listina ilma vastuste hierarhiata.
Nende osade korralik realiseerimine annab 7 punkti. Praktikumi ei arvestata, kui nendes osades on suuremad puudujäägid.
Järgmiste funktsionaalsuste lisamine annab täiendavalt punkte, kuni maksimaalse 15-ni:
- Oma accoundi tegemine: kasutajanimi ja parool.
- Sisselogimine (sisselogitult peab siis olema näha kasutajanimi), väljalogimine ja lingi/kommentaari ning upvote/downvote lubamine ainult sisseloginud kasutajalt.
- Kommentaari ja lingi juures lisaja kasutajanime ja lisamisaja kuvamine.
- Lingi sisestamisel tagi lisamine lingile. Tag on umbes seesama, mis subreddit ja tagi võib alati vabalt valida/sisestada.
- Tagide järgi linkide otsimine: kuvatakse ainult neid linke, millel on valitud/sisestatud tag.
- Tagide listi kuvamine.
Reaalses rakenduses hädavajalikud asjad, millega meie praksis aga ei pea tegelema (kuid ei ole ka keelatud):
- Mõistliku, aega arvestava rankingu algoritmi tegemine: vt redditi rankingualgoritmi ja hacker newsi rankingualgoritmi.
- Juba sisestatud info muutmine ja kustutamine.
- Erinevad turvaküsimused (sql injection jne).
- Kasutajakonto tegemise kontrollid emaili ja captcha-ga.
- Pikkade loetelude jagamine lehekülgedeks.
- Teksti/kasutaja/jne otsingud.
- Oma accoundi eelistused ja nende kasutamine kuvamisel.
- Kommentaaride esitamine hiearhiana.
Tehnoloogilised nõuded
- Kõik serverirakendused tuleb realiseerida PHP-s ja andmeid tuleb hoida kas MySQL-s või Postgresis. Kui oled andmebaasinduses algaja, kasuta pigem MySQL-i, kui aga oled juba kogemusi omandanud ja sul on server, kus ise oled adminiõigustega, võiksid proovida Postgresi.
- Rakendus peab olema võrgus vabalt brauseriga ligipääsetav, mitte lihtsalt töötama näiteks sinu laptopis.
- Serverarvutina võid - nagu teises praktikumis - kasutada kas dijkstrat või omaenda vabalt valitud lemmikserverit.
Abi ja soovitusi
Esiteks: tutvu PHP ja SQL materjalidega, kas kursuse esilehelt või koopiana siitsamast:
- Vaata Vorgurakendused 1 SQL naited loengust. Uus 2011 andmebaas on nimega reddit, kasutajanimi on rstudent ja parool on student: see on kõigile ühine.
- Vaata lihtsaid php ja mysql näiteid loengust. Siin kasutatakse vana andmebaasi nimega facebook ja andmebaasi kasutajat fstudent, mis sel aastal enam kasutusel pole.
Ideid ja näpunäiteid:
- Kõige lihtsam on teha kogu rakendus üheainsa php failina. Keerulisemate programmide puhul ei ole see hea mõte, meie lihtsal juhul aga on päris mugav.
- Kui tahad siiski oma php faili struktureerida (näiteks hoida eraldi failis päis ja jalus) siis selleks on php include käsk.
- Erinevad tegevused (a la lingi lisamine, votemine, sisse logimine) saad realiseerida nii, et php lehel vaadatakse, mis argumendid on antud (näiteks reddit.php?username=xx&password=yy peale tehakse sisse logimine, reddit.php?op=logout peale väljalogimine, reddit.php?link=www.ttu.ee peale tehakse vote jne). Alati on võimalik võtta ka kasutusele eraldi parameeter, ntx op, mille väärtus ütleb siis, et mis tegevus tuleb ette võtta.
- Debugimise jaoks on lihtsam kasutada vormidel method="get", siis näed brauserist, et mis parameetrid saadeti.
- Samuti on debugimise juures abiks trükkida välja (echo) kokkuklopsitud sql päring tervikuna, et kontrollida, kas sai selline, nagu tahtsid.
- Sisselogimise jaoks (tee seda alles siis, kui baasfunktsionaalsus olemas!) on mõistlik kasutada php session funktsiooni (lihtsa tutoriali leiad siit) ja seada sessioonis sisselogimisel $_SESSION['username'] ja edaspidi alati kontrollida, kas on isset($_SESSION['username']) ja kui jah, siis kasutada seda väärtust, kui ei, siis kuvada sisselogimise vorm. Väljalogimisel piisab siis session_destroy() kasutamisest.
Sobivad õpetused lugemiseks, umbes selles järjekorras:
- PHP
- Väikese ajaloolise ülevaate leiad wikipeediast
- Põhiõpetus on php oma saidil: loe sealt kõigepealt sissejuhatavat tutoriali
- W3school-si php tutorial on samuti päris OK.
- SQL, loe selles järjekorras
- SQL hea esimene kiirsissejuhatus
- enamateks detailideks loe w3schools'i tutoriali
- hea pikem tutorial alternatiivina eelmistele ja selle sees alternatiivne cheat-sheet
- mysql esmane tutorial ja vaata veidi mysql manuaali
- SQL injection vt ka seda ja seda ja seda
- SQL PHP-s, loe selles järjekorras
- Erinevad vormivälja-tüübid peale hariliku <input type=text>
- w3schools vormi-sissejuhatus
- väga mahukas ka detailne info: vormid html standardis ja selle eriti oluline osa
- suhteliselt ok vorminäide php kontekstis
Siit leiad eelmise aasta versiooni: ITV0110 4. töö 2010