ITV0110 4. töö 2016: Andmebaasiga serverirakendus: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
Uus lehekülg: 'left|Tinder == Mis tuleb teha == Neljanda praktikumi ülesandeks on ehitada mini-tinder (vaata [https://www.gotinder.com/ saiti] ja [https://en.wikipedia....'
 
Resümee puudub
1. rida: 1. rida:
[[Pilt:tinder2.png|left|Tinder]]
[[Pilt:twitter.png|left|Twitter]]




== Mis tuleb teha ==
== Mis tuleb teha ==


Neljanda praktikumi ülesandeks on ehitada mini-tinder (vaata [https://www.gotinder.com/ saiti] ja [https://en.wikipedia.org/wiki/Tinder_%28app%29 wikipediat]) kasutades selleks PHP-d ja MySQL-i.
Neljanda praktikumi ülesandeks on ehitada mini-twitter (vaata [https://www.twitter.com/ saiti] ja [https://en.wikipedia.org/wiki/Twitter wikipediat]) kasutades selleks PHP-d ja MySQL-i.


== Hindamine, kohustuslikud ja mittekohustuslikud osad ==
== Hindamine, kohustuslikud ja mittekohustuslikud osad ==
12. rida: 12. rida:
Konkreetselt on <b>kohustuslikud osad</b>, mis peavad olema tehtud ja mille realiseerimine annab kokku kuni 6 punkti:
Konkreetselt on <b>kohustuslikud osad</b>, mis peavad olema tehtud ja mille realiseerimine annab kokku kuni 6 punkti:


* Oma accoundi tegemine. Accoundis pead saama anda oma kasutajatunnuse, nime, parooli ja emaili vabatekstina.
* Saad sisse logida: minimaaljuhul parooli ei kasuta, sisestad mistahes kasutajanime. Edasiarendatud variandis on parooliga sisselogimine. Ilma sisse logimata midagi teha või vaadata ei saa.
* Saad sisse logida. Ilma sisse logimata midagi teha või vaadata ei saa.
* Pead saama sisestada enda kohta kirjeldusteksti (a la kes ma olen vms).
* Pead märkima ära, kas oled mees- või naissoost.
* Teised kasutajad saavad otsida kasutajaid ja näha nende oma lehte: kasutajanime, kirjeldusteksti ja (edasiarendatud juhul) fotot.
* Pead uploadima ühe foto endast.
* Pead saama sisestada tweeti ehk lühikese teksti.
* Saad kirjutada ühe teksti endast.
* Sinu oma lehel on näha sinu enda viimased kolm tweeti.
* Kõik kasutajad näevad kõiki teisi - fotot ja teksti - aga esialgu ainult ühte korraga: pilti ja teksti, ning ainult vastassoo omasid. Selle juures on "like" ja "nope" nupud. Kui vajutad ühe või teise, saad järgmist kasutajat näha jne.


Elementaarsed turvanõuded peavad olema täidetud:
Elementaarsed turvanõuded peavad olema täidetud:
26. rida: 25. rida:
<b>Soovitavad osad</b>, mis annavad lisaks baaspunktidele veel kuni 6 punkti:
<b>Soovitavad osad</b>, mis annavad lisaks baaspunktidele veel kuni 6 punkti:


* Kui kaks kasutajat kumbki vajutab teise kohta "like", siis näevad kumbki, et nad on üksteist like'nud. Vastasel korral infot selle kohta, kes sind like's või nope's pole. 2 punkti.
* (2 p) Oma accoundi tegemine. Accoundis pead saama anda oma kasutajatunnuse, parooli ja emaili vabatekstina. Sel juhul toimub sisselogimine kasutajanime ja parooli kasutades ja account peab sisselogimiseks juba olemas olema.
* Kui kaks kasutajat on üksteist like'nud, siis nad saavad saata läbi rakendusele üksteisele sõnumeid: kirjutad teksti ja seepeale teine näeb, kes ja mis teksti on kirjutanud. 2 punkti, eeldab, et eelmine alamülesanne on tehtud.
* (1 p) Pead saama uploadida ühe foto endast ja teised peavad sinu fotot sinu lehel nägema.
* Saad seadistada, kui kaugel asuvate kasutajate pilte veel kuvatakse, ning brauseris sisselogimisel brauser salvestab sinu hetkeasukoha hinnangu andmebaasi - see on sinu asukoht antud sessiooni jaoks - ja kuvamisel kasutatakse seda seadistust otsustamaks, kas pilti kuvada või ei. 2 punkti, eeldab, et eelmised alamülesanded on tehtud.
* (1 p) Pead saama jälgida ehk followda mistahes teisi twitteri kasutajaid: valid või otsid ühe ja vajutad "follow" nuppu.  
* (1 p) Sul on leht, kus näed, keda sa jälgid ning saad neid sealt lehelt ka mitte-jälgitavaks teha.
* (1 p) Sul on "home" leht, kus näed korraga kõigi followtud kasuajate (ja mitte teiste) viimaseid N tweeti kronoloogilises järjekorras.


Lisaks neile funktsionaalsustele võib ehitada juurde muid huvitavaid mittetriviaalseid funktsionaalsusi, mis annavad piisavalt hästi tegemise korral siis samuti veidi lisapunkte.
Lisaks neile funktsionaalsustele võib ehitada juurde muid huvitavaid mittetriviaalseid funktsionaalsusi, mis annavad piisavalt hästi tegemise korral siis samuti veidi lisapunkte.
36. rida: 37. rida:
* Kõik serverirakendused tuleb realiseerida [http://www.php.net/ PHP-s] ja andmeid tuleb hoida [http://www.mysql.com MySQL-s]
* Kõik serverirakendused tuleb realiseerida [http://www.php.net/ PHP-s] ja andmeid tuleb hoida [http://www.mysql.com MySQL-s]
* Rakendus peab olema võrgus vabalt brauseriga ligipääsetav, mitte lihtsalt töötama näiteks sinu laptopis.
* Rakendus peab olema võrgus vabalt brauseriga ligipääsetav, mitte lihtsalt töötama näiteks sinu laptopis.
<!-- * Serverarvutina võid kasutada kas dijkstrat või omaenda vabalt valitud lemmikserverit. -->


== Abi ja soovitusi ==
== Abi ja soovitusi ==
175. rida: 175. rida:
* 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.  
* 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 [http://php.net/manual/en/function.include.php include] käsk.
* Kui tahad siiski oma php faili struktureerida (näiteks hoida eraldi failis päis ja jalus) siis selleks on php [http://php.net/manual/en/function.include.php include] käsk.
* Erinevad tegevused (a la sisse/väljalogimine foto lisamine, fotode otsimine) saad realiseerida nii, et php lehel vaadatakse, mis argumendid on antud (näiteks fotod.php?username=xx&password=yy peale tehakse sisse logimine, fotof.php?op=logout peale väljalogimine 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.
* Erinevad tegevused (a la sisse/väljalogimine, foto lisamine) saad realiseerida nii, et php lehel vaadatakse, mis argumendid on antud (näiteks fotod.php?username=xx&password=yy peale tehakse sisse logimine, fotof.php?op=logout peale väljalogimine 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.
* 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.
* Samuti on debugimise juures abiks trükkida välja (echo) kokkuklopsitud sql päring tervikuna, et kontrollida, kas sai selline, nagu tahtsid.
210. rida: 210. rida:




Siit leiad eelmise aasta versiooni: [[ITV0110 4. töö 2014: Andmebaasiga serverirakendus|ITV0110 4. töö 2014]], [[ITV0110 4. töö: Andmebaasiga serverirakendus php-s|ITV0110 4. töö 2013]], [[ITV0110 4. töö 2012]] <!-- , [[vahetulemused 17 dets]], [[ajut vrak 1]] -->
Siit leiad eelmise aasta versiooni: [[ITV0110 4. töö 2016: Andmebaasiga serverirakendus|ITV0110 4. töö 2014]]

Redaktsioon: 15. november 2016, kell 05:54

Twitter
Twitter


Mis tuleb teha

Neljanda praktikumi ülesandeks on ehitada mini-twitter (vaata saiti ja wikipediat) kasutades selleks PHP-d ja MySQL-i.

Hindamine, kohustuslikud ja mittekohustuslikud osad

Praktikum annab maksimaalselt 12 punkti.

Konkreetselt on kohustuslikud osad, mis peavad olema tehtud ja mille realiseerimine annab kokku kuni 6 punkti:

  • Saad sisse logida: minimaaljuhul parooli ei kasuta, sisestad mistahes kasutajanime. Edasiarendatud variandis on parooliga sisselogimine. Ilma sisse logimata midagi teha või vaadata ei saa.
  • Pead saama sisestada enda kohta kirjeldusteksti (a la kes ma olen vms).
  • Teised kasutajad saavad otsida kasutajaid ja näha nende oma lehte: kasutajanime, kirjeldusteksti ja (edasiarendatud juhul) fotot.
  • Pead saama sisestada tweeti ehk lühikese teksti.
  • Sinu oma lehel on näha sinu enda viimased kolm tweeti.

Elementaarsed turvanõuded peavad olema täidetud:

  • Ei kuvata otse, nö puhastamata välja kasutaja sisestatud tekste (javascript injection ehk XSS takistatud)
  • Ei kasutata otse, nö puhastamata, kasutaja sisestatud tekste SQL päringute kokkupanekul (sql injection takistatud)

Soovitavad osad, mis annavad lisaks baaspunktidele veel kuni 6 punkti:

  • (2 p) Oma accoundi tegemine. Accoundis pead saama anda oma kasutajatunnuse, parooli ja emaili vabatekstina. Sel juhul toimub sisselogimine kasutajanime ja parooli kasutades ja account peab sisselogimiseks juba olemas olema.
  • (1 p) Pead saama uploadida ühe foto endast ja teised peavad sinu fotot sinu lehel nägema.
  • (1 p) Pead saama jälgida ehk followda mistahes teisi twitteri kasutajaid: valid või otsid ühe ja vajutad "follow" nuppu.
  • (1 p) Sul on leht, kus näed, keda sa jälgid ning saad neid sealt lehelt ka mitte-jälgitavaks teha.
  • (1 p) Sul on "home" leht, kus näed korraga kõigi followtud kasuajate (ja mitte teiste) viimaseid N tweeti kronoloogilises järjekorras.

Lisaks neile funktsionaalsustele võib ehitada juurde muid huvitavaid mittetriviaalseid funktsionaalsusi, mis annavad piisavalt hästi tegemise korral siis samuti veidi lisapunkte.

Tehnoloogilised nõuded

  • Kõik serverirakendused tuleb realiseerida PHP-s ja andmeid tuleb hoida MySQL-s
  • Rakendus peab olema võrgus vabalt brauseriga ligipääsetav, mitte lihtsalt töötama näiteks sinu laptopis.

Abi ja soovitusi

Esiteks: tutvu PHP ja SQL materjalidega, kas kursuse esilehelt või koopiana siitsamast:

Debugimine

  • Dijkstra php konf on selline, et php vigade korral kuvatakse neid välja veebilehel, vaata näiteks http://dijkstra.cs.ttu.ee/~tammet/t2.php
  • Vajadusel kasuta - lisaks eelnevale - oma proges trükkimiseks echo käsku, et tuvastada, kus täpselt ja mis muutujate väärtuste korral viga tekib.
  • Alternatiivina (mida enam ilmselt vaja ei lähe) saan endiselt teha nii, et logid dijkstrasse sisse ja ütled käsurealt
php myprog.php

ja siis kuvatakse sulle käsurealt süntaksivead välja. .

Andmebaasi tabelite versioonid vs kustutamine

Dijkstras ei ole myqsli kasutajale st2014 hetkel antud õigust tabeleid kustutada. Sestap on hea mõte teha oma tabelid versiooninumbriga ja jätta vanad tabelid lihtsalt prahina alles.

Näiteks nii: matriklinrvN_tabel ehk t12334v3_users

Teine hea variant on kasutusel olevaid tabeleid jooksvalt vajaduse järgi muuta. Seda saad teha näiteks nii:

ALTER TABLE tt1v1_photos ADD filename  VARCHAR(100);

Faili upload

Uploadi jaoks sobiv tutorial on siin

Kõigepealt otse tutorialist pärit html vormi näide:

<!DOCTYPE html>
<html>
<body>

Upload form:

<form action="upload.php" method="post" 
    enctype="multipart/form-data">
    Select photo upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html> 

Järgmisena sobiv näide uploaditud faili kontrollimise ja salvestamise jaoks. Näide baseerub sellelsamal w3schoolsi tutorialil.

NB!

  • Enne selle näitega katsetamist tee endale public_html alla kataloog uploads ja anna kõigile õigus sinna kataloogi kirjutada ja sealt lugeda:
chmod a+rw uploads
  • Üleslaetud fail salvestatakse numbrilise nimega 10 pluss suffix, a la 10.jpg. Vaata brauserist taneli kataloogist

Php näide:


<?php

function upload_my_file($fileid) {
  echo "starting";
  $target_dir = "uploads/";
  $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
  
  echo "<p>$target_file " . $target_file;
  $uploadOk = 1;
  $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
  echo "<p>$imageFileType " . $imageFileType;
  $saved_file = $target_dir . $fileid . "." . $imageFileType;
  // Check if image file is a actual image or fake image
  if(isset($_POST["submit"])) {
      $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
      if($check !== false) {
          echo "File is an image - " . $check["mime"] . ".";
          $uploadOk = 1;
      } else {
          echo "File is not an image.";
          $uploadOk = 0;
      }
  }
  echo "all is fine before checks";
  // Check if file already exists
  if (file_exists($target_file)) {
      echo "Sorry, file already exists.";
      $uploadOk = 0;
  }
  // Check file size
  if ($_FILES["fileToUpload"]["size"] > 5000000) {
      echo "Sorry, your file is too large.";
      $uploadOk = 0;
  }
  // Allow certain file formats
  if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  && $imageFileType != "gif" ) {
      echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
      $uploadOk = 0;
  }
  // Check if $uploadOk is set to 0 by an error
  if ($uploadOk == 0) {
      echo "Sorry, your file was not uploaded.";
  // if everything is ok, try to upload file
  } else {
      if (move_uploaded_file(
           $_FILES["fileToUpload"]["tmp_name"], $saved_file)) {
          echo "<p>The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
      } else {
          echo "<p>Sorry, there was an error uploading your file.";
      }
  }
}

upload_my_file(10);

?> 

Turvaküsimused

Sul on tingimata vaja teha kahte turva-asja:

  • Mitte võimaldada kasutajal sisestada teksti nii, et see tekst sisaldaks veebilehele kuvamisel html tage (pilte, skripte jms). Selleks kasuta htmlentities funktsiooni või htmlspecialchars funktsiooni või mõnda tema analoogi. Kindlasti katseta ise, et asi töötaks!
  • Mitte võimaldada kasutajal sisestada teksti nii, et see tekst tekitaks SQL lausesetes ootamatuid kõrvalefekte (näiteks kasutaja sisestab pildi nimeks '; drop table ...' vms). Selleks kasuta mysqli_real_escape_string funktsiooni.

Veel 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 sisse/väljalogimine, foto lisamine) saad realiseerida nii, et php lehel vaadatakse, mis argumendid on antud (näiteks fotod.php?username=xx&password=yy peale tehakse sisse logimine, fotof.php?op=logout peale väljalogimine 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
SQL, loe selles järjekorras
SQL PHP-s, loe selles järjekorras
Erinevad vormivälja-tüübid peale hariliku <input type=text>


Siit leiad eelmise aasta versiooni: ITV0110 4. töö 2014