Professional Documents
Culture Documents
07 PHP DB Konkekcije - Unlocked
07 PHP DB Konkekcije - Unlocked
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
pia
Boris Damjanovi
PHP PDO
PDO je akronim za PHP Data Objects.
Kao to je ADO akronim za ActiveX Data Objects
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
mysql:host=name;dbname=dbname
odbc:odbc_dsn
oci:dbname=dbname;charset=charset
sqlite:/path/to/db/file
sqlite::memory:
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(...)
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
pia
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
pia
Boris Damjanovi
23
pia
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
pia
Boris Damjanovi
29
$stmt->bindValue(':ime', $ime);
Povezuje se odmah
Boris Damjanovi
30
pia
Boris Damjanovi
31
pia
Boris Damjanovi
32
...
...
Boris Damjanovi
33
Rezultat
pia
Boris Damjanovi
34
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
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);
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
pia
Boris Damjanovi
40
pia
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();
?>
pia
Boris Damjanovi
42
PhpProject26
Rezultat
pia
Boris Damjanovi
43
pia
Boris Damjanovi
44
MySQLi
Karakter upitnik (?) u nekom iskazu moemo da zamijenimo sa varijablom tipa String, Integer,
Double ilil Blob (Binary Lagre Object)
$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();
$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
pia
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
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
Boris Damjanovi
58
PDO (INSERT)
pia
Boris Damjanovi
59
PDO (UPDATE)
pia
Boris Damjanovi
60
PDO (SELECT)
pia
Boris Damjanovi
61
pia
Boris Damjanovi
62
pia
Boris Damjanovi
63
pia
Boris Damjanovi
64
pia
Boris Damjanovi
65
Prepared statements
pia
Boris Damjanovi
66
Transactions
pia
Boris Damjanovi
67
pia
Boris Damjanovi
68