26
Návrh a tvorba WWW Přednáška 6 PHP II – Databáze

Návrh a tvorba WWW Přednáška 6

Embed Size (px)

DESCRIPTION

Návrh a tvorba WWW Přednáška 6. PHP II – Databáze. MySQL. Výhody široká komunita uživatelů otevřený zdrojový kód rychlost sytému k dispozici pro mnoho platforem Nevýhody nedostatečný výkon při náročných operacích nepodporuje pokročilé databázové techniky - PowerPoint PPT Presentation

Citation preview

Page 1: Návrh a tvorba WWW Přednáška 6

Návrh a tvorba WWWPřednáška 6

PHP II – Databáze

Page 2: Návrh a tvorba WWW Přednáška 6

MySQL

Výhody• široká komunita uživatelů• otevřený zdrojový kód• rychlost sytému• k dispozici pro mnoho platforem

Nevýhody• nedostatečný výkon při náročných operacích• nepodporuje pokročilé databázové techniky

Systém dostupný na http://www.mysql.com/.

Page 3: Návrh a tvorba WWW Přednáška 6

MySQL a PHP

Rozhraní PHP• mysql• mysqli

Page 4: Návrh a tvorba WWW Přednáška 6

Rozhraní mysqli I.

Otevření spojení se serverem MySQL. Argumenty:

• hostitel• uživatelské jméno• heslo• název databáze• port TCP• unixový doménový soket

Inicializace rozhraní MySQLi. Vrací objekt, jenž bude používán společně s funkcí mysqli_real_connect.

mysqli_connect(…)$mysqli = new mysqli(…)

mysqli_init(…)$mysqli = new mysqli

Page 5: Návrh a tvorba WWW Přednáška 6

Rozhraní mysqli II.

Nastavení předvoleb spojení.

Otevření spojení se serverem.

Uzavření spojení se serverem.

Načtení posledního chybového kódu resp. Zprávy vztahující se k neuskutečněnému spojení.

mysqli_options(…)$mysqli->options(…)

mysqli_close(…)$mysqli->close(…)

mysqli_connect_errno()mysqli_connect_error()

mysqli_real_connect(…)$mysqli->real_connect(…)

Page 6: Návrh a tvorba WWW Přednáška 6

Dotazy

Odeslání dotazu na DB server. Argumenty:

• objekt spojení• dotaz• režim (s vyrovnávací pamětí, nebo bez ní)

Odeslání více dotazů na DB server. Argumenty:

• objekt spojení• dotazy

mysqli_query(…)

mysqli_multi_query(…)Mysqli->multi_query(…)

Page 7: Návrh a tvorba WWW Přednáška 6

Zpracování výsledku

Zpracování dotazu a načtení řádku výsledku.

Zpracování dotazu a načtení výsledku do asociativního pole.

Zpracování dotazu a načtení výsledku do objektu.

mysqli_fetch_row()$mysqli->fetch_row()

mysqli_fetch_assoc()$mysqli->fetch_assoc()

mysqli_fetch_object()$mysqli->fetch_object()

Page 8: Návrh a tvorba WWW Přednáška 6

Binding (vázání proměnný)

Vázání vstupních proměnných1. Příprava příkazu

2. Svázání příkazu a vstupních proměnných3. Přiřazení hodnot proměnným

4. Spuštění příkazu

mysqli_prepare(…)$mysqli->prepare()

mysqli_stmt_bind_param(…)$stmt->bind_param(…)

mysqli_stmt_execute(…)$stmt->execute

Page 9: Návrh a tvorba WWW Přednáška 6

Binding (vázání proměnný)

Vázání výstupních proměnných1. Příprava příkazu

2. Spuštění příkazu

3. Svázání příkazu a výstupními proměnnými

4. Načtení dat do výstupních proměnných

mysqli_prepare(…)$mysqli->prepare()

mysqli_stmt_fetch(…)$stmt->bind_fetch

mysqli_stmt_execute(…)$stmt->execute

mysqli_stmt_bind_result(…)$stmt->bind_result(…)

Page 10: Návrh a tvorba WWW Přednáška 6

SQLite

Výhody• samostatnost, nezávislost• součástí PHP 5• jednoduchost a rychlost• procedurální i objektové rozhraní

Nevýhody• neexistence serverového procesoru• soubory nejsou binárně bezpečné• transakce zamykají soubory

Systém dostupný na http://www.sqlite.org/.

Page 11: Návrh a tvorba WWW Přednáška 6

SQLite

Otevření spojení k databázi SQLite. Argumenty:

• název souboru• oprávnění (chmod)• chybová zpráva

Uzavření spojení

sqlite_open(…)$sqlite = new SQLiteDatabase(…)

sqlite_close(…);

Page 12: Návrh a tvorba WWW Přednáška 6

SQLite příklad

$dbhandle = sqlite_open('db/test.db', 0666, $error);if (!$dbhandle) die ($error); $query = "SELECT Name, Sex FROM Friends";$result = sqlite_query($dbhandle, $query);if (!$result) die("Cannot execute query.");

$row = sqlite_fetch_array($result, SQLITE_ASSOC); print_r($row);

sqlite_rewind($result);$row = sqlite_fetch_array($result, SQLITE_NUM); print_r($row);

sqlite_rewind($result);$row = sqlite_fetch_array($result, SQLITE_BOTH); print_r($row);

sqlite_close($dbhandle);

Page 13: Návrh a tvorba WWW Přednáška 6

PDO

PDO je rozšíření PHP (od verze 5.1) umožňující jednotným způsobem komunikovat s různými databázemi.

PDO podporuje• DBLIB: FreeTDS / Microsoft SQL Server / Sybase• Firebird (http://firebird.sourceforge.net/): Firebird/Interbase 6• IBM (IBM DB2)• INFORMIX - IBM Informix Dynamic Server• MYSQL (http://www.mysql.com/): MySQL 3.x/4.0• OCI (http://www.oracle.com): Oracle Call Interface• ODBC: ODBC v3 (IBM DB2 and unixODBC)• PGSQL (http://www.postgresql.org/): PostgreSQL• SQLITE (http://sqlite.org/): SQLite 3.x

Dostupní na http://www.php.net/manual/en/book.pdo.php.

Page 14: Návrh a tvorba WWW Přednáška 6

Příklad PDO

Více příkladů např. na http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#4.3

try { $dbh = new PDO("mysql:host='localhost';dbname=mysql", 'username', 'password'); echo 'Spojeno s DB'; $count = $dbh->exec("INSERT INTO people(name, sex) VALUES ('cegan', 'male')"); $sql = "SELECT * FROM people"; foreach ($dbh->query($sql) as $row){ print $row['name'] .' - '. $row['sex'] . '<br />'; } $dbh = null; //ukončení spojení} catch(PDOException $e){ echo $e->getMessage();}

Page 15: Návrh a tvorba WWW Přednáška 6

Oracle DB v PHP

Podpora databázového stroje Oracle je zajištěna prostřednictvím extenzí:

• Oracle• OCI8• PDO

Oracle Instant client(http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html).

Účet na DB vám vytvoří cvičící předmětu Databázové systémy 2.

The Undeground PHP and Oracle ManualChristopher Jones, Alison Hollowayhttp://www.oracle.com/us/technologies/026973.pdf

Page 16: Návrh a tvorba WWW Přednáška 6

Spojení

Otevření spojení

Uzavření spojení

Změna hesla

$c=oci_connect($username, $password, $dbname, $charset);

oci_close($c);

oci_password_change($c, $username, $oldPassword, $newPassword);

Page 17: Návrh a tvorba WWW Přednáška 6

Select

1. Rozebrání příkazu (Parse) – parsování dotazu pro vykonání2. Přiřazení dat (Bind) – přiřazení dat do dotazu pro lepší výkon a bezpečnost3. Vykonání (Execute) – vykonání dotazu4. Načtení (Fetch) – vrácení výsledku dotazu z databáze

$c = oci_connect("hr", "hrpwd", "localhost/XE");$s = oci_parse($c, 'select city, postal_code from location');oci_execute($s);print '<table border="1">';while ($row = oci_fetch_array($s, OCI_NUM+OCI_RETURN_NULLS)) { print '<tr>'; foreach ($row as $item) print '<td>'.htmlentities($item).'</td>'; print '</tr>‘;}print '</table>';oci_free_statement($s);

Page 18: Návrh a tvorba WWW Přednáška 6

Zpracování výsledku

Funkce načteníoci_fetch_all() – vrátí výsledek najednouoci_fetch_array() – vrátí výsledek v polioci_fetch_assoc() – vrátí výsledek v asociativním polioci_fetch_object() – vrátí výsledek jako objektoci_fetch_row() – vrátí výsledek v indexovaném poli

Parametry pro funkci oci_fetch_array() OCI_ASSOC – vrátí výsledek jako asociativní poleOCI_NUM – vrátí výsledek jako číselně indexované poleOCI_BOTH – vrátí výsledek jako indexované i asociativní pole (výchozí hodnota)OCI_RETURN_NULLS – vrátí PHP NULL hodnotu pro NULL dataOCI_RETURN_LOBS – vrátí aktuální LOB data místo OCI- LOB zdroje.

$rowarray = oci_fetch_array($statement, $mode);

$rowarray = oci_fetch_array($s, OCI_NUM + OCI_RETURN_NULLS);

Page 19: Návrh a tvorba WWW Přednáška 6

Insert, delete, update, create, drop

Pro vykonání Data Definition Language (DDL) and Data Manipulation Language (DML) dotazů, jako například CREATE, INSERT, atd. je nejjednodušší použít příkaz pro parsování SQL dotazu (oci_parse) a jeho následné vykonání (oci_execute).$s = oci_parse($conn, "create table i1test (col1 number)");oci_execute($s);

Page 20: Návrh a tvorba WWW Přednáška 6

Transakce

Transakce je logická jednotka zpracování dat, která se skládá z jednoho nebo více SQL příkazů provedených jedním uživatelem.

Transakce končí buď úspěšným „commitnutím“, tedy promítnutím změn do databáze, nebo rollbackem, vrácením databáze do původního stavu, resp. neprovedením změn naakumulovaných v průběhu transakce.

Funkce související s transakcemioci_execute($s, OCI_DEFAULT); - bez provedení commituoci_rollback($c); - vrácení databáze do původního stavu

$c = oci_connect('hr', 'hrpwd', 'localhost/XE');$s = oci_parse($c, "insert into mytable values ('abc')");oci_execute($s, OCI_DEFAULT); // don't commit$s = oci_parse($c, "begin updatelog('INSERT attempted'); end;");oci_execute($s, OCI_DEFAULT); // don't commitoci_rollback($c);

Page 21: Návrh a tvorba WWW Přednáška 6

Obsluha chyb

Obsluha chyb je v knihovně OCI řešena funkcí oci_error(). Funkce vyžaduje různé argumenty závisející na kontextu předešlého volání. Návratová hodnota funkce je pole.

Prvky pole vrácen funkcí oci_error():$e["code"] – číslo chyby $e["offset"] – pozice chyby v SQL dotazu$e["message"] – chybová zpráva $e["sqltext"] – SQL dotaz$c = oci_connect("hr", "not_hrpwd", "localhost/XE");if (!$c) { $e = oci_error(); // No parameter passed var_dump($e);}$s = oci_parse($c, "select city from locations");$rc = oci_execute($s);if (!$rc) { $e = oci_error($s); // Statement resource passed var_dump($e);}$rc = oci_fetch_all($s, $results);if (!$rc) { $e = oci_error($s); // Statement resource passed var_dump($e);}

Page 22: Návrh a tvorba WWW Přednáška 6

Přiřazení dat

Binding je vysoce doporučovaným prostředkem pro cachování dotazu na databázovém serveru a znovupoužití exekučních plánů. Dále nabízí způsob jak chránit dotazy proti SQL injection.

$s = oci_parse($c, "select last_name from employees where employee_id = :eidbv");$myeid = 101;oci_bind_by_name($s, ":eidbv", $myeid);oci_execute($s);$row = oci_fetch_array($s, OCI_ASSOC);echo "Last name is: ". $row['LAST_NAME'] ."<br>\n";

Page 23: Návrh a tvorba WWW Přednáška 6

Omezení počtu řádku výsledku (limit)

Oracle nezná klíčové slovo LIMIT a proto je pro omezení počtu řádků výstupu SQL dotazu potřeba použít speciální konstrukci, která prostřednictvím vnořeného selectu toto omezení zprostředkuje.

select *from ( select a.*, rownum as rnum from (-- Váš dotaz --) a where rownum <= MAX_ROWS )where rnum >= MIN_ROWS

Page 24: Návrh a tvorba WWW Přednáška 6

Omezení počtu řádku výsledku (limit)

Oracle nezná klíčové slovo LIMIT a proto je pro omezení počtu řádků výstupu SQL dotazu potřeba použít speciální konstrukci, která prostřednictvím vnořeného selectu toto omezení zprostředkuje.

select *from ( select a.*, rownum as rnum from (-- Váš dotaz --) a where rownum <= MAX_ROWS )where rnum >= MIN_ROWS

Page 25: Návrh a tvorba WWW Přednáška 6

Auto-increment

Autoinkrementování hodnoty sloupečku tabulky je v prostředí Oracle realizováno prostřednictvím sequence a trigeru.

Vytvoření sequence a trigeru

Příklad konkrétního použití při konstrukci dotazu

acreate sequence myseq;

create trigger mytrigger before insert on mytable for each row begin select myseq.nextval into :new.myid from dual;end;

$s = oci_parse($c, "insert into mytable (mydata) values ('Hello')");oci_execute($s);

Page 26: Návrh a tvorba WWW Přednáška 6

Získání posledního vloženého ID

OCI8 nemá žádnou explicitní funkci “insert_id”, která by vracela poslední vložené ID. Místo toho lze použít RETURN INTO.

Obdobně pomocí descriptoru

$s = oci_parse($c,"insert into mytable (mydata) values ('Hello') return myid into :id");oci_bind_by_name($s, ":id", $id, 20, SQLT_INT);oci_execute($s);echo "Data inserted with id: $id\n";

$rid = oci_new_descriptor($c, OCI_D_ROWID);$s = oci_parse($c,"insert into mytable (mydata) values ('Hello') return rowid into :rid");oci_bind_by_name($s, ":rid", $rid, -1, OCI_B_ROWID);oci_execute($s);