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

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
6. rida: 6. rida:
Neljanda praktikumi ülesandeks on ehitada mini-instagram, kasutades selleks PHP-d ja MySQL-i. Konkreetselt:
Neljanda praktikumi ülesandeks on ehitada mini-instagram, kasutades selleks PHP-d ja MySQL-i. Konkreetselt:


* Sisse logida. Ilma sisse logimata uploadida ja kommenteerida ei saa.
* Saad sisse logida. Ilma sisse logimata uploadida ja kommenteerida ei saa.
* Uploadida oma fotosid. Fotol on optsionaalselt nimi ja kirjeldus, mis tuleb/saab anda uploadimise ajal.
* Saad uploadida oma fotosid. Fotol on optsionaalselt nimi ja kirjeldus, mis tuleb/saab anda uploadimise ajal.
* Kustutada oma fotosid.
* Kustutada oma fotosid.
* Kõik kasutajad saavad valida ka teise kasutaja ja näha tema fotosid.
* Kõik kasutajad saavad valida ka teise kasutaja ja näha tema fotosid.

Redaktsioon: 25. november 2014, kell 16:07

Cat
Cat


Mis tuleb teha

Neljanda praktikumi ülesandeks on ehitada mini-instagram, kasutades selleks PHP-d ja MySQL-i. Konkreetselt:

  • Saad sisse logida. Ilma sisse logimata uploadida ja kommenteerida ei saa.
  • Saad uploadida oma fotosid. Fotol on optsionaalselt nimi ja kirjeldus, mis tuleb/saab anda uploadimise ajal.
  • Kustutada oma fotosid.
  • Kõik kasutajad saavad valida ka teise kasutaja ja näha tema fotosid.
  • Kõik sisseloginud kasutajad saavad kõiki fotosid kommenteerida.
  • Kõik sisseloginud kasutajad saavad kõiki fotosid hinnata.
  • Iga kasutaja saab näha kõige kõrgemini hinnatud fotot.

Praktikumi arvestamine ja hindamine

Praktikum annab maksimaalselt 15 punkti.

Edukaks arvestuseks pead realiseerima baasfunktsionaalsuse lihtsamad osad:

  • Oma accoundi tegemine ja oma info sisestamine (parooli pole vaja realiseerida, kasutajatunnus aga küll). Accoundis pead saama anda vähemalt oma kasutajatunnuse, nime ja emaili vabatekstina.
  • Fotode uploadimine ja foto baasinfo salvestamine andmebaasi.
  • Oma fotode loetelu kuvamine (fotode info võtta andmebaasist).
  • Loetelus kuvatud foto nö normaalkujul vaatamine.

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:

  • Sisselogimine parooliga. 2p
  • Oma fotode kustutamine (vajab sisselogimist). 1p.
  • Teiste fotode vaatamine (ei vaja sisselogimist). 1p.
  • Teiste fotode kommenteerimine ja hindamine (vajab sisselogimist). 2p.
  • Kõige kõrgemini hinnatud foto vaatamine (ei vaja sisselogimist). 2p.

Lisaks neile funktsionaalsustele (ja ka nende asemel) võib lisada muid huvitavaid mittetriviaalseid funktsionaalsusi, mis annavad siis samuti punkte lisaks baas-seitsmele.

Reaalses rakenduses hädavajalikud asjad, millega meie praksis aga ei pea tegelema (kuid ei ole ka keelatud ja korralikult tehtuna võib anda lisapunkte):

  • Juba sisestatud info muutmine ja kustutamine.
  • Paroolid ja turvaküsimused (sql injection jne)
  • Pikkade loetelude jagamine lehekülgedeks.
  • Kasutajakonto tegemise kontrollid emaili ja captcha-ga.

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.
  • Serverarvutina võid 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:

Debugimine

  • dijkstras ei näita php süntaksivigade korral mitte midagi. Seepärast logi dijkstrasse sisse ja ütle käsurealt
php myprog.php

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

  • kasuta oma proges trükkimiseks echo käsku, et tuvastada, kus täpselt ja mis muutujate väärtuste korral viga tekib.

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

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);

?> 


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, 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.
  • 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öö 2013, ITV0110 4. töö 2012