Predavanje iz Dinamičkih web aplikacija, 5. predavanje
Video: https://www.youtube.com/watch?v=F-Ib79iKle4&list=PLYqeapOP_CtS0kbdbo_GXFgnS81JGAd8L&index=6
Tema: Pristup bazama, sesije, kolačići.
Datum snimanja: 7.4.2016
2. Baze
● PHP ima nativnu podršku za mnoge baze
● Oracle, MSsql, MySQL, PostgreSQL, SQLite
● na in pristupa tim bazama je sli anč č
● nativna podrška je “brza”
● radi apstrakcije modela baze možemo koristiti
apstrakcijske modele koji nam omogu uju radć
sa razli itim bazama koriste i iste funkciječ ć
● PEAR:MDB2, PDO
● apstrakcijski modeli su “spori”
3. Nativna podrška za MySQL
● mysql ili mysqli ?
● mysql je stari API i koristio se u PHP4 (ali podržava
i PHP5
● mysqli (i=”improved”) je novi API za PHP5
– brži od starog mysql, ali ne podržava sve stare funkcije
(važno ako pokre ete “starije” programe)ć
– nažalost, esto primjeri na Internetu koriste stari APIč
● odabir bi uvijek trebao biti mysqli
6. Razlika u “izvla enju” podatakač
$row = mysqli_fetch_row($result);
● podaci se identificiraju numeri ki u poljuč
$row[0], $row[1]
$obj= mysqli_fetch_object($result);
● podaci se identificiraju nazivom spremljenim
u objekt npr. $obj->CountryCode
7. Razlika u “izvla enju” podatakač
$row = mysqli_fetch_assoc($result);
● podaci se identificiraju nazivom, spremljeni su u polje
npr. $row['CountryCode']
$row= mysqli_fetch_array($result,$type);
● podaci se identificiraju nazivom ili numeri ki, ovisno oč
postavljenom tipu
– type=MYSQLI_NUM – fetch_row
– type=MYSQLI_ASSOC – fetch_assoc
– type=MYSQLI_BOTH – i jedno i drugo u istom polju
8. Druge MySQL funkcije
● mysqli_stmt_num_rows
● zamjenjuje “stari” mysql_num_rows
● vra a broj redova koji su dobiveni u rezultatuć
(SELECT naredba)
● mysqli_affected_rows
● vra a broj redova koji su izmjenjeni prijašnjom SQLć
naredbom (INSER, UPDATE, REPLACE, DELETE)
● mysqli_real_escape_string
● sigurnost!
● dodaje escape za specijalne znakove ( ', “”, )
9. Izvla enje u asocijativno polječ
$data=array();
while ($line=@mysqli_fetch_array($result,
MYSQL_ASSOC))
array_push($data,$line);
● kao rezultat se dobiju podaci iz baze u obliku
dvodimenzionalnog polja npr.
$data[0]=array( 'id'=>0 , 'ime'=>'Toni');
$data[1]=array( 'id'=>1 , 'ime'=>'Zlatan');
$data[2]=array( 'id'=>8 , 'ime'=>'Oliver');
● ovaj oblik je pogodan za foreach funkciju
10. Apstrakcijski modeli
● API koji se spaja na mnoge tablice
● ORM (object relational mapping)
● jednom napišeš, radi svugdje (!?!?!)
● navedeni API-ji rade apstrakciju podataka a ne samih SQL upita
(problem u razlikama SQL upita na bazama)
● svi ve i framework-ci imaju svoje apstrakcijske modeleć
● PDO
● PHP Data Objects
● dolazi sa PHP-om
● lagano, konzistentno
● podržava “Prepared statements”
● Nedostatak: dio SQL-a koji nije kompatibilan se mora pisati ru noč
11. Apstrakcijski modeli
● apstrakcijski APIji nude
● široku paletu dodatnih funkcija,
● lakše pisanja SQL upita (ako uop e treba)ć
● sigurnost
● apstrakcijski APIji traže
● bolje razumjevanje PHP-a i baza
● više procesorske snage i vremena (jer emuliraju i
stvari koje ne trebate)
13. Primjer PDO selecta - sqlite
<?php
try {
$dbh = new PDO("sqlite:/baza.sdb");
$sql = "SELECT * FROM animals";
foreach ($dbh>query($sql) as $row)
print $row['animal_type'] .' '. $row['animal_name'] .
'<br />';
/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e>getMessage();
}
?>
14. PDO prepared statement
● SQL injection je est napad, a dešava se kadč
se nefiltrirani podaci propuste do baze
● kako bi se to sprije ilo treba filtrirati podatkeč
● no kako biti siguran da je sve dobro obavljeno
● zar ne može to obaviti PHP?
● pripremljene naredbe -> obavljaju težak posao
za nas
16. ORM
● Object relation mapping
● Atributi objekata i njihovi odnosi su sa uvanič
pri spremanju podataka u bazu i pri
izvla enju podataka iz bazeč
● Podaci iz klasa (objekata) su mapirani u
tablice u bazi
● Podaci iz tablica su bazi su mapirani u
objekte klase
17. ORM
● ORM radi sav posao, programer samo koristi
objekte
● Pretraživanje, update i brisanje se radi s
jednostavnim naredbama, a ne s SQL-om
● ORM daje perzistenciju objektima.
● Mnogi PHP ORMovi koriste PDO u pozadini
18. Active Record vs Data Mapper
● Active Record
● Objekt u memoriji sadrži i podatke i funkcije za rad s
bazom
● Data Mapper
● Objekt u memoriji sadrži samo korisne podatke
● Dodatni Mapper objekt se koristi za rad s bazom i
on povezuje objekte s podacima i tablice
20. NoSQL baze
● zbog estih potreba za nedefiniranom shemomč
baze, u zadnje vrijeme su popularne NoSQL baze
● funkcioniraju na razne na ineč
● na in primanja i prikaza podatakač
– primitivne key – value kombinacije
– poznati modeli podataka (vektori, polja, mape)
● mjesto držanja podataka
– u memoriji (s mogu im podacima na disku)ć
– na disku
21. NoSQL
● u nekim slu ajevima iznimno korisneč
● u drugima krajnje beskorisne
● MongoDB, Redis, Memcached
22. MongoDB
<?php
// connect to mongodb
$m = new MongoClient();
echo "Connection to database
successfully";
// select a database
$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->mycol;
echo "Collection selected succsessfully";
$document = array(
"title" => "MongoDB",
"description" => "MongoDB example",
"likes" => 100,
"url" => "http://www.tvz.com/",
);
$collection->insert($document);
echo "Document inserted successfully";
?>
<?php
// connect to mongodb
$m = new MongoClient();
echo "Connection to database
successfully";
// select a database
$db = $m->mydb;
echo "Database mydb selected";
$collection = $db->mycol;
echo "Collection selected succsessfully";
$cursor = $collection->find();
// iterate cursor to display title of
documents
foreach ($cursor as $document) {
echo $document["title"] . "n";
}
?>
23. Sesija (ili kako sam pratio korisnika)
● HTTP je stateless protokol
● kako pratiti korisnika?
– po IP adresi? ($_SERVER['REMOTE_ADDR'])
– skrivene varijable ( <input type=”hidden”
name=”pratim_te” value=”d3h5k34jh59”> )
– kola i i (cookie) (a što ako korisnik ne prihva ač ć ć
kola i e?)č ć
24. Sesija u PHP-u
● služi za
● pra enje korisnikać
● spremanja podataka uz trenutnu posjetu
stranicama
● izvodi se kombinacijom skrivenih varijabli i
kola i a, ali bez programerove brige što i kakoč ć
radi.
● sesija se zapo inje naredbomč session_start()
● postavite je na po etak vašeg kodač
25. Primjer koda
<?php
// page1.php
session_start();
echo 'Welcome to page #1<br>';
$_SESSION['favcolor'] = 'green';
// Works if session cookie was accepted
echo '<a href="page2.php">page 2</a>';
?>
<?php
// page2.php
session_start();
echo 'Welcome to page #2<br />';
echo $_SESSION['favcolor']; //
green
echo '<br /><a
href="page1.php">page 1</a>';
?>
26. Varijable i konstante
● identifikator sesije - konstanta SID koja se može
koristiti kad postoji problem sa kola i imač ć
echo '<a href="page2.php?' . SID . '">page 2</a>';
– u novijim verzijama PHP-a konstanta može biti prazna, tad
koristimo session_id() funkciju.
– u nekim slučajevima kad se ne koriste kolačići programer mora
ručno pratiti sesiju
● podaci se spremaju u polje $_SESSION
$_SESSION['favcolor'] = 'green';
echo $_SESSION['favcolor'];
27. Varijable i konstante
● do PHP5.3 se za spremanje podataka u sesiju
koristila funkcija session_register() - od 5.3 se ne
koristi
● podaci u sesiji se spremaju u temporary direktorij
lokalnog servera
● korisnik dobiva samo identifikator sesije putem kola i a ilič ć
SID podatka (na linku ili skrivenoj varijabli)
● kako skalirati sustav?
– zajedni ki direktorij na mrežnom diskuč
– zapis podataka u bazu
– koristiti alternativni sustav za sesije (Msession)
28. Kola i i i torteč ć
● ponekad treba zapisati podatke na klijentu i/ili
podatke koji su neovisni o sesiji
● JavaScript može koristiti kola i e (č ć document.cookie)
● “Zapamti me”
● neovlašteno pra enjeć
● bool setcookie (
string $name [, string $value
[, int $expire = 0 [, string $path
[, string $domain [, bool $secure = false
[, bool $httponly = false ]]]]]] )
29. Kola i i i torteč ć
<?php
$value = 'proba';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()
+3600); /* expire in 1 hour */
setcookie("TestCookie", $value, time()
+3600, "/~stipe/", ".example.com", 1,1);
?>
30. Kola i i i torteč ć
● podatke iz kola i a korisnik šalje u zaglavlju HTTP zahtjevač ć
● $_COOKIE polje
● echo $_COOKIE["sessionid"];
● dostupno tek kad korisnik PONOVNO kontaktira server
31. Neukusni kola i ič ć
● Cookie se briše tako da se postavi prazni string na njega
setcookie("TestCookie", '');
● Kola i i su jednostavni?č ć
● korisnik ih može odbiti
● moraju se poslužiti prije svega ostalog
– idu u headeru odgovora
● redoslijed postavljanja kola i a može biti druga iji odč ć č
onog koji je predvi en PHP kodomđ
32. Za glavu viši
● Sesije koriste kola i eč ć
-> kola i i su u zaglavljuč ć
-> podaci od zaglavlja moraju i i prvić
● PHP dopušta kontroliranje podataka iz zaglavlja
● funkcija header()
– mogu e upisati bilo što što i ina e ide u zaglavljeć č
header('Location: http://www.example.com/')
header("HTTP/1.0 404 Not Found");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
● zaglavlje uvijek ide prije bilo kakvog ispisa
33. Ali mama, ja bi pisao pa onda glavinjao..
● mogu e je generirati stranicu, a tijekom generacijeć
stranice postavljati potrebna zaglavlja i podatke za
sesiju
● Web server ne smije poslati podatke korisniku
● opcija 1: koristimo output buffer
– ob_start()
– ob_flush() i flush()
– ob_clean()
● opcija 2: spremamo stranicu u varijablu i na kraju
napravimo echo ili print
● opcija 3: razdvajamo logiku i prezentaciju – koristimo
template
34. Za više informacija ...
● pogledajte www.php.net
● Session extensions
● setcookie()
● $_COOKIE
● header()