You are on page 1of 68

PIA

07 PHP konekcije sa bazama podataka


Boris Damjanovi

pia

Boris Damjanovi

phpmyadmin
Kreiraemo testnu bazu podataka korienjem
phpmyadmin programa

pia

Boris Damjanovi

phpmyadmin

pia

Boris Damjanovi

pia

Boris Damjanovi

pia

Boris Damjanovi

pia

Boris Damjanovi

pia

Boris Damjanovi

Namjerno prazna stranica

pia

Boris Damjanovi

PHP PDO
PDO je akronim za PHP Data Objects.
Kao to je ADO akronim za ActiveX Data Objects

PDO je proirenje PHP jezika koje je namjenjeno da bi


se omoguilo povezivanje sa razliitim DB sistemima
pomou jedinstvenog interfejsa.

pia

Boris Damjanovi

PHP PDO
PDO podrava veliki broj razliitih SUBP (DBMS)
Microsoft SQL Server / Sybase
Firebird / Interbase
DB2 / INFORMIX (IBM)
MySQL
OCI (Oracle Call Interface)
ODBC
PostgreSQL
SQLite
pia

Boris Damjanovi

10

Data Source Name - DSN


Data Source Name DSN
Generalno
drivername:<driver-specific-stuff>

mysql:host=name;dbname=dbname
odbc:odbc_dsn
oci:dbname=dbname;charset=charset
sqlite:/path/to/db/file
sqlite::memory:

Vie o PDO konekcijama na kraju, u dodatku


pia

Boris Damjanovi

11

MySQL

pia

Boris Damjanovi

12

Zatvaranje konekcije
Koristimo NULL vrijednost

pia

Boris Damjanovi

13

PDO ekstenzija
PDO sistem se sastoji od tri klase
PDO, PDOStatement i PDOException.
Klasa PDO je zaduena za upravljanje konekcijom i
transakcijama, te za kreiranje instanci PDOStatement
klase.
Klasa PDOStatement slui za manipulaciju SQL upitima.
Klasa PDOException koristi se za upravljanje grekama.
pia

Boris Damjanovi

14

PDO ekstenzija
Konekcija se ostvaruje kreiranjem instance PDO klase
$dbh= new PDO($dsn, $username, $password) ili
$dbh= new PDO($dsn, $username, $password,$nizAtributa)
nizAtributa se moe zadati naknadno
$dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
Navodimo da elimo da izuzecima obraujemo greke (ne SILENT
ni WARING)

pia

Boris Damjanovi

15

PDO ekstenzija
Metoda query() vraa instancu klase PDOStatement.
sa npr. SELECT upitom:
$stat = $dbh->query(...)

Broj vraenih redova vidljiv je pomou


echo $ stat >rowCount();

Du instance klase PDOStatement moe se prolaziti


korienjem npr. for each petlje.
foreach($stat >FetchAll() as $red) {
echo $red [ime'] . '<br />';
}

pia

Boris Damjanovi

16

PDO ekstenzija
Za izvrenje UPDATE, DELETE ili INSERT iskaza koristi se
metoda exec().
$db->exec($sql);
PDO omoguava rad sa transakcijama pomou sllijedeih
metoda:

pia

$db->beginTransaction(); // poinje
$db->inTransaction(); // vraa tano, ako je transakcija u toku
$db->commit(); // potvruje
$db->rollback(); // ponitava transakciju
Boris Damjanovi

17

PDO ekstenzija
PDO ekstenzija podrazumjevano kao rezultat upita u PDOStatement
objektu koristi i nazive kolona i brojane indekse
print $row['ime']
print $row[1]
Ovo ponaanje se moe promijeniti pomou
PDOStatement::fetch($args) metode
Kao argument se koristi
PDO::FETCH_ASSOC- vraa niz koji je indeksiran cjelobrojnim
indeskima
PDO::FETCH_BOTH - podrazumjevano, vraa niz koji je
indeksiran cjelobrojnim indeskima i nazivima kolona
...

pia

Boris Damjanovi

18

PDO ekstenzija
Metoda
PDO::lastInsertId() odnosno
PDO::lastInsertId($name)
Vraa zadnji ID (ili SQL sequence polje) odnosno
autoinkrement polje u sistemima koji ga imaju

pia

Boris Damjanovi

19

Novi projekat PhpProject23

pia

Kreiraemo novi projekat pod nazivom PhpProject23


U folderu C:\wamp\www\TestProj23
U diektorijumu source kreiraemo datoteku index.php
Konkecija i Select iskaz

Boris Damjanovi

20

<?php
try {
$user = "root";
$pass = "";
$dbh = new PDO('mysql:host=localhost;dbname=osobe', $user, $pass);
// prvi nacin ne moze select * from, moramo navesti nazive kolona
foreach ($dbh->query('SELECT id, ime, prezime from studenti') as $row) {
print $row['id'] . " ";
print $row['ime'] . " ";
print $row['prezime'] . "<br />";
}
echo "<br />";
// drugi nacin
foreach ($dbh->query('SELECT * from studenti') as $row) {
print $row[0] . " ";
print $row[1] . " ";
print $row[2] . "<br />";
}
// zatvaramo konekciju
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
Listing: Konekcija i SELECT iskaz

pia

Boris Damjanovi

21

PhpProject23
Rezultat
Samo jedan red, oitan na dva naina

pia

Boris Damjanovi

22

Insert into prvi put!


Insert into prvi put!
PDO exec($sql) funkcija izvrava jedan SQL iskaz.
Ona vraa broj (int) redova koji su zahvaeni njenim
djelovanjem.

Koristi se npr. za insert iskaze, a ne za select iskaze.

pia

Boris Damjanovi

23

Novi projekat PhpProject24

pia

Kreiraemo novi projekat pod nazivom PhpProject24


U folderu C:\wamp\www\TestProj24
U diektorijumu source kreiraemo datoteku index.php
Insert into (nesigurno)

Boris Damjanovi

24

<body>
<?php
try {
// postavi varjable na prazan string
$ime = $prezime = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST["ime"]) && isset($_POST["prezime"])) {
$ime = $_POST["ime"];
$prezime = $_POST["prezime"];
/** ***** BP ****** */
$user = "root";
$pass = "";
$dbh = new PDO('mysql:host=localhost;dbname=osobe', $user, $pass);
// setAttribute postavlja razlicite atribute.
// ovdje - nacin obrade gresaka pomocu izuzetka
// (ne SILENT ni WARNING)
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// pomalo nesiguran nacin
$sql = "INSERT INTO studenti (ime, prezime)
VALUES ('$ime', '$prezime')";
...
...
Listing: Prvi dio

pia

Boris Damjanovi

25

...
...
// exec() ne vraca rezultate.. sljedeca stranica

$dbh->exec($sql);
echo "Uspjeno!";
}
}
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die(); // zavrsava skript
}
?>
<h2>PHP insert into</h2>
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
Ime: <input type="text" name="ime">
<br><br>
Prezime: <input type="text" name="prezime">
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
Listing: Drugi dio
pia

Boris Damjanovi

26

PhpProject24

pia

Boris Damjanovi

27

PDO
MySQLi ima metodu real_escape_string koja se
koristi za osiguranje od XSS napada
PDO moe da koristi metodu quote() za osiguranje od
XSS napada ili da koristi pripremljene (prepared)
upite

pia

Boris Damjanovi

28

Pripremljeni (prepared) iskazi


Pripremljeni (prepared) iskazi daju nam najmanje
dvije prednosti
Jednom pripremljen kod se bre izvrava
Ako se nalazi u petlji, ne kompajlira se svaki put ponovo

Ako aplikacija koriati pripremljene (prepared)


iskaze, zatieni smo od SQL injection napada, jer
e nas drajver zatititi.
Ipak, ako se neki drugi dio upita formira kao nezatien
(unescaped) string, SQL injection napad je i dalje mogu

pia

Boris Damjanovi

29

Pripremljeni (prepared) iskazi


Metoda PDO->prepare($sql) vraa instancu PDOStatement
klase.
Za povezivanje SQL iskaza i podataka koriste se metode
bindValue() i bindParam()
$stmt->bindParam(':ime', $ime);
Povezuje se pri pozivu execute()

$stmt->bindValue(':ime', $ime);

Povezuje se odmah

PHP PDO upit e nakon pripreme biti izvren pomou


execute() metode.
pia

Boris Damjanovi

30

Novi projekat PhpProject25

pia

Kreiraemo novi projekat pod nazivom PhpProject25


U folderu C:\wamp\www\TestProj25
U diektorijumu source kreiraemo datoteku index.php
Insert Into (prepared)

Boris Damjanovi

31

Poinje kao u prethodnom zaatku...


<body>
<?php
try {
// postavi varjable na prazan string
$ime = $prezime = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST["ime"]) && isset($_POST["prezime"])) {
$ime = $_POST["ime"];
$prezime = $_POST["prezime"];
/* * ***** BP ****** */
$user = "root";
$pass = "";
// konekcija (handler)
$dbh = new PDO('mysql:host=localhost;dbname=osobe', $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
...
...
Listing: Prvi dio

pia

Boris Damjanovi

32

...
...

$stmt = $dbh->prepare("INSERT INTO studenti (ime,


prezime) VALUES (:ime, :prezime)");
$stmt->bindParam(':ime', $ime);
$stmt->bindParam(':prezime', $prezime);
$stmt->execute();
echo "Uspjeno!";
}
}
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
<h2>PHP insert into</h2>
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
Ime: <input type="text" name="ime">
<br><br>
Prezime: <input type="text" name="prezime">
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
pia

Listing: Drugi dio

Boris Damjanovi

33

Rezultat

pia

Boris Damjanovi

34

Namjerno prazna stranica


Namjerno prazna stranica

pia

Boris Damjanovi

35

MySQLi
Ekstenzija MySQLi omoguava konekcije sa MySQL
bazama podataka od verzije 4.1.
Prvobitna MySQL konekcija se vie ne razvija jo od verzije PHP 4.3.1 iz
2002 godine

MySQLi znai MySQL Improoved

pia

Boris Damjanovi

36

MySQLi
MySQLi moe da se koristi putem proceduralnog i putem
objektno orjentisanog pristupa:
Proceduralno:
$conn = mysqli_connect($servername, $username,
$password);
Objektno orjentisano
$conn = new mysqli($servername, $username,
$password);

Obje vraaju objekt koji predstavlja konekciju ka MySQL


serveru!

pia

Boris Damjanovi

37

MySQLi
Objektno orjentisani pristup
Na raspolaganju su nam slijedei objekti:
mysqli
mysqli_stmt
mysqli_result
mysqli_driver
mysqli_warning
mysqli_sql_exception
pia

Boris Damjanovi

38

MySQLi
MySQLi metoda query() koristi se za izvravanje upita
Vraa mysqli_result objekt
Rezultat upita (mysqli_result objekt) se moe
iterativno prolaziti, npr:
while($row = $result->fetch_assoc()){
echo $row[ime'] . '<br />';

pia

Boris Damjanovi

39

MySQLi
mysqli_result objekt ima varijablu $num_rows koja navodi broj
vraenih redova u sluaju Select iskaza
$result->num_rows

U sluaju Update ili Delete iskaza, koristi se varijabla


$affected_rows koja navodi broj redova zahvaenih operaciijom
$result->affected_rows

Po zavretku rada sa mysqli_result objektom, preporuljivo je


osloboditi memoriju prdruenu varijabli
$result->free();

Ili zatvoriti konekciju:


$dbh->close();

pia

Boris Damjanovi

40

Novi projekat PhpProject26

pia

Kreiraemo novi projekat pod nazivom PhpProject26


U folderu C:\wamp\www\TestProj26
U diektorijumu source kreiraemo datoteku index.php
MySQLi select

Boris Damjanovi

41

<?php
$servername="localhost"; $db = "osobe";
$user = "root"; $pass = "";
// Objektno orjentisan nacin - $dbh je konekcija (handler)
$dbh = new mysqli($servername, $user, $pass, $db);
if ($dbh->connect_error) {
die("Neuspjesno: " . $conn->connect_error);
}
echo "Uspjesno povezani <br />";
$sql = "SELECT id, ime, prezime from studenti";
$result = $dbh->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " " . $row["ime"]. " " . $row["prezime"]. "<br>";
}
} else {
echo "Nema slogova (n-torki)";
}
$dbh->close();
?>

Listing: MySQLi select

pia

Boris Damjanovi

42

PhpProject26
Rezultat

pia

Boris Damjanovi

43

Namjerno prazna stranica


Namjerno prazna stranica

pia

Boris Damjanovi

44

MySQLi

I u sluaju korienja MySQLi ekstenzije, pfreporuljivo je osloniti se na


pripremljene (prepared) skaze

Oni se realizuju pomou metoda prepare() koji vraa mysqli_stmt objekt

Karakter upitnik (?) u nekom iskazu moemo da zamijenimo sa varijablom tipa String, Integer,
Double ilil Blob (Binary Lagre Object)

$statment = $db->prepare("SELECT `name` FROM `users` WHERE `username` = ?");

Zatim se koristi metoda bind_param() da bi se upitnik u iskazu povezao a


vrijednou

$name = 'Bob';
$statement->bind_param('s', $name);
Koristimo

pia

s za String
i za integer
d za double
b za Blob

Boris Damjanovi

45

MySQLi
Po zavretku rada sa mysqli_result objektom,
preporuljivo je osloboditi memoriju prdruenu
varijabli
$result->free();

Ili zatvoriti konekciju:


$dbh->close();

$statement->free_result();
pia

Boris Damjanovi

46

MySQLi
MySQLi ekstenzija automatski potvruje transakcije
Ako elimo da sami upravljamo transakcijama,
moramo to navesti
$dbh->autocommit(FALSE);
Transakcije se potvruju pomou
$db->commit();
I ponitavaju
$db->rollback();
pia

Boris Damjanovi

47

Novi projekat PhpProject27

pia

Kreiraemo novi projekat pod nazivom PhpProject27


U folderu C:\wamp\www\TestProj27
U diektorijumu source kreiraemo datoteku index.php

Boris Damjanovi

48

<body>
<?php
try {
$ime = $prezime = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST["ime"]) && isset($_POST["prezime"])) {
$ime = $_POST["ime"];
$prezime = $_POST["prezime"];
$servername = "localhost"; $db = "osobe"; $user = "root";$pass = "";
// Objektno orjentisan nacin - $dbh je konekcija (handler)
$dbh = new mysqli($servername, $user, $pass, $db);
if ($stmt = $dbh->prepare("NSERT INTO studenti (ime, prezime) VALUES (?, ?)")) {
$stmt->bind_param("ss", $ime, $prezime);
$stmt->execute();
$stmt->close();
}
}
}
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
echo "Upjesno!"
?>
<h2>PHP insert into</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
Ime: <input type="text" name="ime">
<br><br>
Prezime: <input type="text" name="prezime">
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>

Listing: Listing
pia

Boris Damjanovi

49

Rezultat

pia

Boris Damjanovi

50

Dodatak: razliite PDO konekcije


Dodatak: razliite PDO konekcije

pia

Boris Damjanovi

51

MySQL

pia

Boris Damjanovi

52

SQLite (datoteka)

pia

Boris Damjanovi

53

SQLite (memorija)

pia

Boris Damjanovi

54

Oracle

pia

Boris Damjanovi

55

ODBC

pia

Boris Damjanovi

56

Zatvaranje konekcije
Koristimo NULL vrijednost

pia

Boris Damjanovi

57

Perzistentna PDO konekcija

Konekcija ostaje iva izmeu vie zahtjeva


Ne preporuuje se
Moe biti opasno, ako skript neoekivano
zavri
$dbh = new PDO($dsn, $user, $pass,
array(
PDO_ATTR_PERSISTENT => true
)
);
pia

Boris Damjanovi

58

PDO (INSERT)

pia

Boris Damjanovi

59

PDO (UPDATE)

pia

Boris Damjanovi

60

PDO (SELECT)

pia

Boris Damjanovi

61

Error Handling (1)

pia

Boris Damjanovi

62

Error Handling (2)

pia

Boris Damjanovi

63

Error Handling (3)

pia

Boris Damjanovi

64

Error Handling (4)

pia

Boris Damjanovi

65

Prepared statements

pia

Boris Damjanovi

66

Transactions

pia

Boris Damjanovi

67

Get Last Insert Id

pia

Boris Damjanovi

68

You might also like