SlideShare a Scribd company logo
1 of 34
PHP – baze i sesije
Stipe Predanić
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”
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
Pristup bazi
<?php
$link = mysqli_connect("localhost", "my_user", "my_passwo
rd", "world");
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %sn", mysqli_connect_error()
);
    exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID 
DESC LIMIT 50,5";
Pristup bazi
if ($result = mysqli_query($link, $query)) {
    /* fetch associative array */
    while ($row = mysqli_fetch_row($result)) {
        printf ("%s (%s)n", $row[0], $row[1]);
    }
    /* free result set */
    mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
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
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
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 ( ', “”,  )
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
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č
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)
Primjer PDO selecta
<?php
$hostname = 'localhost'; $username = 'username'; $password = 'password';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, 
$password);
    $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();
    }
?>
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();
    }
?>
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
PDO prepared statement
<?php
// configuration
$dbtype = "sqlite";
$dbfile = "database.sdb";
// database connection
$conn = new PDO("$dbtype:/$dbfile");
// new data
$title = 'PHP Security';
$author = 'Jack Hijack';
// query
$sql = "INSERT INTO books (title,author) VALUES (:title,:author)";
$q = $conn->prepare($sql);
$q->execute(array(':author'=>$author,
':title'=>$title));
?>
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
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
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
ORM
Active Records Data Mapper
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
NoSQL
● u nekim slu ajevima iznimno korisneč
● u drugima krajnje beskorisne
● MongoDB, Redis, Memcached
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";
}
?>
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?)č ć
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č
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>';
?>
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'];
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)
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 ]]]]]] )
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);
?>
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
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đ
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
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
Za više informacija ...
● pogledajte www.php.net
● Session extensions
● setcookie()
● $_COOKIE
● header()

More Related Content

Similar to [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.

Auditing of user activity through NoSQL database
Auditing of user activity through NoSQL databaseAuditing of user activity through NoSQL database
Auditing of user activity through NoSQL databaseKristijan Duvnjak
 
Algoritmi i strukture_podataka_2016-05_v01
Algoritmi i strukture_podataka_2016-05_v01Algoritmi i strukture_podataka_2016-05_v01
Algoritmi i strukture_podataka_2016-05_v01Leonardo Miljko
 
R11 Vadas One Click Clone
R11 Vadas One Click CloneR11 Vadas One Click Clone
R11 Vadas One Click Cloneguest9c64c8c
 
Web App Security for Devs
Web App Security for DevsWeb App Security for Devs
Web App Security for DevsAxilis
 
Web App Security for Devs
Web App Security for DevsWeb App Security for Devs
Web App Security for DevsVedran Maršić
 
ZGFlex Drupal
ZGFlex DrupalZGFlex Drupal
ZGFlex Drupalzgflex
 
Mean Stack JavaCro 2014
Mean Stack JavaCro 2014Mean Stack JavaCro 2014
Mean Stack JavaCro 2014Nenad Pecanac
 
Big Brother Hrvatska 2007 - Case Study - BizBuzz
Big Brother Hrvatska 2007 - Case Study - BizBuzzBig Brother Hrvatska 2007 - Case Study - BizBuzz
Big Brother Hrvatska 2007 - Case Study - BizBuzzwebburza
 
Zahtjevno računalstvo u oblaku HTC Cloud.pptx
Zahtjevno računalstvo u oblaku HTC Cloud.pptxZahtjevno računalstvo u oblaku HTC Cloud.pptx
Zahtjevno računalstvo u oblaku HTC Cloud.pptxsindikatpolicijehnzk
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaFive
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeMihovil Rister
 
Data WareHose
Data WareHoseData WareHose
Data WareHoseKruno Ris
 
Kad imaš PostgreSQL ne treba ti NoSQL
Kad imaš PostgreSQL ne treba ti NoSQLKad imaš PostgreSQL ne treba ti NoSQL
Kad imaš PostgreSQL ne treba ti NoSQLYlodi
 

Similar to [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5. (20)

CUC2011-Dinko
CUC2011-DinkoCUC2011-Dinko
CUC2011-Dinko
 
Auditing of user activity through NoSQL database
Auditing of user activity through NoSQL databaseAuditing of user activity through NoSQL database
Auditing of user activity through NoSQL database
 
Algoritmi i strukture_podataka_2016-05_v01
Algoritmi i strukture_podataka_2016-05_v01Algoritmi i strukture_podataka_2016-05_v01
Algoritmi i strukture_podataka_2016-05_v01
 
DORS2011-Dinko
DORS2011-DinkoDORS2011-Dinko
DORS2011-Dinko
 
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad PećanacJavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
 
R11 Vadas One Click Clone
R11 Vadas One Click CloneR11 Vadas One Click Clone
R11 Vadas One Click Clone
 
Web App Security for Devs
Web App Security for DevsWeb App Security for Devs
Web App Security for Devs
 
Web App Security for Devs
Web App Security for DevsWeb App Security for Devs
Web App Security for Devs
 
ZGFlex Drupal
ZGFlex DrupalZGFlex Drupal
ZGFlex Drupal
 
Mean Stack JavaCro 2014
Mean Stack JavaCro 2014Mean Stack JavaCro 2014
Mean Stack JavaCro 2014
 
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
 
Big Brother Hrvatska 2007 - Case Study - BizBuzz
Big Brother Hrvatska 2007 - Case Study - BizBuzzBig Brother Hrvatska 2007 - Case Study - BizBuzz
Big Brother Hrvatska 2007 - Case Study - BizBuzz
 
Zahtjevno računalstvo u oblaku HTC Cloud.pptx
Zahtjevno računalstvo u oblaku HTC Cloud.pptxZahtjevno računalstvo u oblaku HTC Cloud.pptx
Zahtjevno računalstvo u oblaku HTC Cloud.pptx
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, Javantura
 
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil RisterJavantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
 
Data WareHose
Data WareHoseData WareHose
Data WareHose
 
Kad imaš PostgreSQL ne treba ti NoSQL
Kad imaš PostgreSQL ne treba ti NoSQLKad imaš PostgreSQL ne treba ti NoSQL
Kad imaš PostgreSQL ne treba ti NoSQL
 
Javantura Zagreb 2014 - Alfresco-Neo4j integracija - Damir Murat
Javantura Zagreb 2014 - Alfresco-Neo4j integracija - Damir MuratJavantura Zagreb 2014 - Alfresco-Neo4j integracija - Damir Murat
Javantura Zagreb 2014 - Alfresco-Neo4j integracija - Damir Murat
 
JavaCro'15 - Java parallelization - Zlatko Sirotić
JavaCro'15 - Java parallelization - Zlatko SirotićJavaCro'15 - Java parallelization - Zlatko Sirotić
JavaCro'15 - Java parallelization - Zlatko Sirotić
 

More from Stipe Predanic

Osnove bežičnih mreža - Predavanje: Topologije
Osnove bežičnih mreža - Predavanje: TopologijeOsnove bežičnih mreža - Predavanje: Topologije
Osnove bežičnih mreža - Predavanje: TopologijeStipe Predanic
 
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli Stipe Predanic
 
Osnove bežičnih mreža - Predavanje: Antene
Osnove bežičnih mreža - Predavanje: AnteneOsnove bežičnih mreža - Predavanje: Antene
Osnove bežičnih mreža - Predavanje: AnteneStipe Predanic
 
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacije
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacijeOsnove bežičnih mreža - Predavanje Bežične radiokomunikacije
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacijeStipe Predanic
 
[ERRO] Predavanje: FPGA 12.1.2017
[ERRO] Predavanje: FPGA 12.1.2017 [ERRO] Predavanje: FPGA 12.1.2017
[ERRO] Predavanje: FPGA 12.1.2017 Stipe Predanic
 
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016 [ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016 Stipe Predanic
 
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016 [ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016 Stipe Predanic
 
[ERRO] Predavanje: Napajanje uređaja 8.12.2016
[ERRO] Predavanje: Napajanje uređaja 8.12.2016 [ERRO] Predavanje: Napajanje uređaja 8.12.2016
[ERRO] Predavanje: Napajanje uređaja 8.12.2016 Stipe Predanic
 
[ERRO] Predavanje: Prikaz podataka 1.12.2016
[ERRO] Predavanje: Prikaz podataka 1.12.2016 [ERRO] Predavanje: Prikaz podataka 1.12.2016
[ERRO] Predavanje: Prikaz podataka 1.12.2016 Stipe Predanic
 
[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOSStipe Predanic
 
[ERRO] Predavanje: Porodice mikroupravljača
[ERRO] Predavanje: Porodice mikroupravljača[ERRO] Predavanje: Porodice mikroupravljača
[ERRO] Predavanje: Porodice mikroupravljačaStipe Predanic
 
[ERRO] Predavanje: 8051
[ERRO] Predavanje: 8051 [ERRO] Predavanje: 8051
[ERRO] Predavanje: 8051 Stipe Predanic
 
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016)
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016) [ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016)
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016) Stipe Predanic
 
[ERRO] Predavanje: MARIE model procesora
[ERRO] Predavanje: MARIE model procesora [ERRO] Predavanje: MARIE model procesora
[ERRO] Predavanje: MARIE model procesora Stipe Predanic
 
[ERRO] Predavanje: Ponavljanje digitalnih sklopova
[ERRO] Predavanje: Ponavljanje digitalnih sklopova [ERRO] Predavanje: Ponavljanje digitalnih sklopova
[ERRO] Predavanje: Ponavljanje digitalnih sklopova Stipe Predanic
 
[ERRO] Uvodno predavanje (pravila polaganja ispita)
[ERRO] Uvodno predavanje (pravila polaganja ispita) [ERRO] Uvodno predavanje (pravila polaganja ispita)
[ERRO] Uvodno predavanje (pravila polaganja ispita) Stipe Predanic
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 12.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12. Stipe Predanic
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 11.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11. Stipe Predanic
 
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7. Stipe Predanic
 
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4. Stipe Predanic
 

More from Stipe Predanic (20)

Osnove bežičnih mreža - Predavanje: Topologije
Osnove bežičnih mreža - Predavanje: TopologijeOsnove bežičnih mreža - Predavanje: Topologije
Osnove bežičnih mreža - Predavanje: Topologije
 
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli
Osnove bežičnih mreža - Predavanje 4: 802.11 protokoli
 
Osnove bežičnih mreža - Predavanje: Antene
Osnove bežičnih mreža - Predavanje: AnteneOsnove bežičnih mreža - Predavanje: Antene
Osnove bežičnih mreža - Predavanje: Antene
 
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacije
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacijeOsnove bežičnih mreža - Predavanje Bežične radiokomunikacije
Osnove bežičnih mreža - Predavanje Bežične radiokomunikacije
 
[ERRO] Predavanje: FPGA 12.1.2017
[ERRO] Predavanje: FPGA 12.1.2017 [ERRO] Predavanje: FPGA 12.1.2017
[ERRO] Predavanje: FPGA 12.1.2017
 
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016 [ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016
[ERRO] Predavanje: 8 i 32 bitni mikroupravljači/mikroprocesori 15.12.2016
 
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016 [ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016
[ERRO] Predavanje: Komunikacija s mikroupravljačem 8.12.2016
 
[ERRO] Predavanje: Napajanje uređaja 8.12.2016
[ERRO] Predavanje: Napajanje uređaja 8.12.2016 [ERRO] Predavanje: Napajanje uređaja 8.12.2016
[ERRO] Predavanje: Napajanje uređaja 8.12.2016
 
[ERRO] Predavanje: Prikaz podataka 1.12.2016
[ERRO] Predavanje: Prikaz podataka 1.12.2016 [ERRO] Predavanje: Prikaz podataka 1.12.2016
[ERRO] Predavanje: Prikaz podataka 1.12.2016
 
[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS
 
[ERRO] Predavanje: Porodice mikroupravljača
[ERRO] Predavanje: Porodice mikroupravljača[ERRO] Predavanje: Porodice mikroupravljača
[ERRO] Predavanje: Porodice mikroupravljača
 
[ERRO] Predavanje: 8051
[ERRO] Predavanje: 8051 [ERRO] Predavanje: 8051
[ERRO] Predavanje: 8051
 
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016)
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016) [ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016)
[ERRO] Predavanje: ulazi/izlazi na mikroupravljač (27.10.2016)
 
[ERRO] Predavanje: MARIE model procesora
[ERRO] Predavanje: MARIE model procesora [ERRO] Predavanje: MARIE model procesora
[ERRO] Predavanje: MARIE model procesora
 
[ERRO] Predavanje: Ponavljanje digitalnih sklopova
[ERRO] Predavanje: Ponavljanje digitalnih sklopova [ERRO] Predavanje: Ponavljanje digitalnih sklopova
[ERRO] Predavanje: Ponavljanje digitalnih sklopova
 
[ERRO] Uvodno predavanje (pravila polaganja ispita)
[ERRO] Uvodno predavanje (pravila polaganja ispita) [ERRO] Uvodno predavanje (pravila polaganja ispita)
[ERRO] Uvodno predavanje (pravila polaganja ispita)
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 12.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 12.
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 11.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 11.
 
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 7.
 
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 4.
 

[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.

  • 1. PHP – baze i sesije Stipe Predanić
  • 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
  • 15. PDO prepared statement <?php // configuration $dbtype = "sqlite"; $dbfile = "database.sdb"; // database connection $conn = new PDO("$dbtype:/$dbfile"); // new data $title = 'PHP Security'; $author = 'Jack Hijack'; // query $sql = "INSERT INTO books (title,author) VALUES (:title,:author)"; $q = $conn->prepare($sql); $q->execute(array(':author'=>$author, ':title'=>$title)); ?>
  • 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()